X-档案

歪酷博客
从今以后 @ 2004-10-24 23:49

一.信息爆炸
信息爆炸导致:
  1.信息过量,难以消化;
  2.信息真假难以辨识;
  3.信息安全难以保证;
  4.信息形式不一致,难以统一处理。
于是人们开始提出一个新的口号:“要学会抛弃信息”。
人们开始考虑:“如何才能不被信息淹没,而是从中及时发现有用的知识、提高信息利用率?”
面对这一挑战,数据开采和知识发现(DMKD)技术应运而生,并显示出强大的生命力。

二.数据爆炸但知识贫乏
   随着数据库技术的迅速发展以及数据库管理系统的广泛应用,目前的数据库系统可以高效地实现数据的录入、查询、统计等功能,但无法发现数据中存在的关系和规则,无法根据现有的数据预测未来的发展趋势。缺乏挖掘数据背后隐藏的知识的手段,导致了“数据爆炸但知识贫乏”的现象。

三.支持数据挖掘技术的基础
支持数据挖掘的三种基础技术已经发展成熟:
   1.海量数据搜集
   2.强大的多处理器计算机
   3.数据挖掘算法
Friedman[1997]列举了四个主要的技术理由激发了数据挖掘的开发、应用和研究的兴趣:
   1. 超大规模数据库的出现,例如商业数据仓库和计算机自动收集的数据记录;
   2.先进的计算机技术,例如更快和更大的计算能力和并行体系结构;
   3.对巨大量数据的快速访问;
   4.对这些数据应用精深的统计方法计算的能力。

四.数据库技术的发展
   数据搜集(提供历史性的、静态的数据信息)---->
   数据访问(在记录级提供历史性的、动态数据信息)---->
   数据仓库(在各种层次上提供回溯的、动态的数据信息)---->
   数据挖掘(提供预测性的信息)

五.数据挖掘的发展
   机器学习---->知识工程---->机器学习

   数据库中的知识发现(KDD:Knowledge discovery in database):泛指所有从源数据中发掘模式或
   联系的方法,并用KDD来描述整个数据发掘的过程,包括最开始的制定业务目标到最终的结果分析
   数据挖掘(data mining):描述使用挖掘算法进行数据挖掘的子过程。

   数据仓库与数据挖掘: 数据仓库的发展是促进数据挖掘越来越热的原因之一。但是,数据仓库并
   不是数据挖掘的先决条件,因为有很多数据挖掘可直接从操作数据源中挖掘信息。





 
从今以后 @ 2004-10-24 22:53

四 数据挖掘学科的分析框架
各个成熟的学科都有其分析、解决问题的框架和方法论,一般称之为分析框架。譬如研究经济学,常使用的分析框架有交易成本、博弈论、代理人等等。在数据挖掘学科当中,由于不同问题领域的背景不同,因此不存在一个放之四海都皆准的研究框架。因此这里我们给出一个抽象的一般性框架仅供参考。
1 理解商业问题
这个阶段在我看来是整个分析处理过程中最重要最关键的一环,但往往被很多人轻视了。 这个环节的根本目的在于理解业务问题,可以通过以下问题列表来帮助你明确目标:
   是否有必要选用数据挖掘?
   是否有一些感兴趣的客户群资料?
   在了解客户资料的时候应该注意哪些约束性问题?
   领域专家对数据的了解程度如何?是否存在无效的数据资源?某些特别的数据可以从哪里得到?
   根据领域专家的意见,哪些问题是最重要的?
   哪些数据现在得不到,但一旦得到就可以立即行动?

2 数据准备
    (1)确认和获取数据。构建模型的第一步是确认是获取数据。通常情况下,所谓合适的数据是可用于分析的、逻辑清楚的、易获取的数据。其次,数据应当尽可能完整,使用抽样调查之类的数据集合显然不行。当然不排除个别应用当中专门针对抽样调查数据进行挖掘,但此时就不能简单将结果模型用于未回答调查问卷的对象。
  如果进行数据挖掘分析的目的是进行预测,则数据中应包括预期的输出。举以前的一个老案例,某通讯公司准备为其客户制定一份促销优惠的服务政策列表,例如月通话时长超过100小时折扣比例、团体入网折扣比例等等。该公司目前拥有下列数据资料:对所有客户的销售资料;按促销政策清单入网接受相应服务的客户名单;反映客户购买情况的详细资料。但恰恰遗漏的是到底哪些客户收到(或看到)促销清单这个数据,因此根据这些数据构建预测响应模型毫无意义。


  (2)生成有效数据、探索数据(Data Exploring)、数据清洁(Data Cleaning)  
  数据挖掘成功与否取决于数据质量的好坏。考虑下列问题列表:
  字段是否充分?
 缺失数据是否严重?
  字段值是否合法?
 字段值是否符合逻辑?
 单个字段的分布是否有说明?
  引起数据不准确的原因有很多,在通常的商业活动里,重要字段比如价格、数量会比较准确。但一些不太常用的数据,如性别、所在区域可能不准确。
    数据探索是指在清洁数据、正式建模前通过各种方法查看数据的分布,以了解数据的质量和特性。常用的方法有散点图、卡方检验等工具。在常用数据挖掘工具如SAS的Enterprise Miner、CART中都有Data Explorer工具。
   如果发现数据中存在缺失、错误、冗余等不合理现象,应通过数据清洁手段进行处理。具体的方法可参阅相关文献,不一一列举。
(3)粒度转换
    粒度是建模数据的级别大小。通常情况下我们都针对原始数据的行级别进行分析。例如同一客户的资料放入一行进行分析;但另外一种情形下,如有关车辆保险的分析中,每辆车虽然都有其型号、索赔次数、索赔金额、设备估价等数据,但保险公司不大可能对每辆车感兴趣,此时会将以年-车辆形式生成数据,转换成按报单格式汇总的数据。
如:
   报单  年份  车辆  理赔次数 金额
       00001 1998 京GF0001 1     1000
       00001  1998 京GF0002
       00002  1998 京GF0003
       00002  1999 京GF0004
       00002  1999 京GF0002
合并后
   报单  几年期  车龄  理赔次数 金额
       00001  1     1         1      1000
       00002  2     2        0       0
(4)加入衍生变量。衍生变量值是合并原始数据生成的结果。例如
  所有交易数量和交易资金的总额;通话费用为0的月份总数;从开始使用到使用完毕使用率的变化;国际长途、普通长途、市话分布比例等。
     通过OLAP系统可以生成这些衍生变量,从这点也可以理解OLAP与数据挖掘之间的关系。
(5)准备建模数据集
   也就是用于建立数据挖掘模型的数据。在数据清理、数据转换及添加衍生变量后还有一些问题需要考虑。当根据历史数据建立预测模型的时候,在建模数据集中,稀疏数据的比例是多少?通常我们选取15-30%的比例来建模。又比如欺诈诊测模型的建立中,那些有欺诈记录的数据所占比例不到1%。不难推测,由这样的数据集建立的几乎所有模型中,预测成功的可能性达到99%-成功预测没有欺诈的可能性。模型非常精确,但可能完全没有用。因此,我们需要将建模数据集分成三部分:训练数据集、测试数据集、评估数据集。

3 建模。
待续


 
从今以后 @ 2004-10-24 22:52

********写在前面的话*********

     实际上昨天开始下决心动笔写这个专栏的时候,我已经能想像到一定会有热心的朋友关注-毕竟文章起了这么一个不大不小的颇能吸引人眼球的东西(千万别联想到北京地铁里高声叫卖的小报,标题动辄就是中国XX日已向XX宣战云云)。责任心也好、虚荣心也好,都让我不得不诚惶诚恐、认认真真把这个系列写下去。raconteur 博友提的意见已经虚心采纳,相信不会让你失望的。还有Beta1和Yubin ,谢谢你们的鼓励。需要跟大家解释一下的是:写这篇文章的最初目的,是想让那些已经看过一些有关数据挖掘的书籍或文章,但还不知所云的读者澄清一些认识上的误区,因此一些名词和术语没有给出定义,这也是我没有写作经验的缘故,见谅!

(二)数据挖掘不是什么

       提出这个问题很容易,回答却没有看起来那么简单。比如,我可以说,数据挖掘不是售货机,投入一个硬币,吐出来一筒可乐-输入一堆数据,产生一个方程......等等都无助于正确回答这个问题。那我们就索性从前文“数据挖掘是什么”,数据挖掘能干什么入手看看双刃剑的另一面。

      第一部分“数据挖掘是什么”实际上写的比我计划要写的简单。仅仅给出了一个定义及几条注脚而已。但不管怎样最核心的东西毕竟写出来了。数据挖掘说到底是一种方法,“对观测到数据集合进行分析,目的是发现未知的关系和以数据拥有者可以理解并对其有价值的新颖方式来总结数据。”也就是说,它是对观测数据的次级处理,往往是数据的副产品。比如,物流中心的批销单(可以理解成订单)历史数据,本身的目的是为了处理发货和配送,但用数据挖掘,可以对客户进行分类或聚类,进而也许有助于销售预测。这样,“不是什么”的问题也就来了,它的确不是专门性进行的一项完整工作,也就是说,没有人会说:老王,我们准备预测一下下个月营业高峰什么时候出现,你弄些数据来挖一挖。没有数据,挖掘是扯淡的。很多数据挖掘项目失败,不在于实施者不懂算法,也往往不在于模型建立不合理不正确,而在于源头的数据就不准确不“原始”,为挖掘而挖掘。

      定义的后一部分要求产生的结果是“新颖的”,那我们不多说,又一条“不是什么”可以这么理解:数据挖掘不是你先看一眼批销单,然后说我猜买《克林顿与莱温斯基》的人一定会买《希拉里自传》,我们挖一挖批销单库看看。当然这么说有的时候不能完全算错,因为毕竟科学探索还得要有想像力-但数据挖掘一般说来结果都可能会让你大跌眼镜,不是你想当然想出来然后验证。

最后再从另一个维度“数据挖掘能作什么”出发回答“数据挖掘不是什么”。

任何严肃的数据挖掘教科书(我列几本,大家可以找找。J.Han ,Micheline Kambr,"Data Mining-Concepts and Techniques";David Hand "Principles of Data Mining"; Michael J.A.Berry,"Mastering Data Mining-The Art and Science of Customer Relationship Management";Adriaans,P.,and Zantige "Data Mining")都覆盖到以下几个区域(后续文章会详细阐述):

1 分类(Classification)
分类首先要对一个新的客观事物特征进行描述,然后将客观事物的观察值分配到事先确定的类别之中。
因此,数据挖掘不是先知,能预知新的类别(异常探测是另一个话题),必须是事先明确的类别,经过训练后将待分类数据归到类别标签下去。
2 估计(estimaiton)
分类处理的是离散的结果:如“是”与“不是”,“中国”,“日本”,而估计处理的是连续的结果,因此也可以看成分类的扩展,二者在实践中常常结合使用,比如银行要决定该给哪些顾客贷款,考虑的做法是将所有顾客放入一个模型,给每个客户一个从0到1的分数,即对贷款的响应概率。分类的任务转换成建立一个分数临界数值,根据对顾客响应概率的估计来对他分类。
因此这一点不再阐述。
3 预测(Prediction)
有人认为预测不是一种独立的方法,任何预测都是分类或者估计,关键在于你强调什么。我的理解是区别点在于检验。分类理论上你是可以检验的,而预测你只能等到事情发生之后。
但记住,数据挖掘同样不是未卜先知,一切的神秘都在数据里,玄机是跟分类和估计一样,都得通过训练数据建立先验的某种模型(如树或贝叶斯网络),然后在此基础和前提下预测。想想也是有道理的,现实生活中,我们太相信一些专家,学者的话,老吃哑巴亏,人家说今年房价一定升,咱就把攥的紧紧的钱拿出来去买房,结果好像别人的升,你的房子按兵不动啊。“专家”们的预测也是有前提和模型的,只是他的模型,只在书本或他脑子里,我们这些老百姓无缘听到,也可能人家根本不屑讲给我们这些听不懂的人。
4 关联(AssociationRules)
这是数据挖掘中最常见的一类问题。几乎所有的介绍数据挖掘概念的文章中动辄都拿这个为例,“啤酒和尿布”,“菜篮子分析”,“购物车”分析都是这一类问题的通俗说法。
我先提醒大家一句,数据挖掘运算的结果,即便是frequent item(也就是有意义的那些关联项目)也可能是数目非常庞大的,需要进一步分析。不是挖一通然后眼睛一亮泪流满面向全世界宣布:买香烟最多的人买打火机也最多!!
5 聚类(clustering)
聚类跟分类不同,对于数据会归于哪一“类”,事先是不知道的,完全是unsupervised学习过程,自然也就没有什么样本的概念。但同样提醒大家的是,学习的时候注意,任何的聚类方法仍然有隐性的前提在里面,就是聚类的依据,总
归是某种“长度”,“距离”,“相似性”之类的概念或角度,而绝不是挖出来白人黑人黄种人一目了然。不同的计算方法结果会有不同。
待续.......




 
从今以后 @ 2004-10-24 22:50

宇宙之大,万事万物概莫变化无常。模型作为一种抽象的工具,远在几千年前我们的老祖宗就已经意识到其作用,人们制造瓷器、陶器、铜器、金器、银器等等,都要首先制作各种“模子”。进而推广之,自古以来,人们就提出了各种非实物的形式模型。中国古代人们提出的“阴阳互补模式”、“五行生克模式”、“天人合一模式”、“易经卦象模式”等等,用这些思维模式去尝试解决多种多样的问题。
 数据挖掘作为近年来新兴的一门计算机边缘学科,在我国也逐渐引起了越来越多人的关注,各种学术及应用文章如汗牛充栋,令人眼花缭乱。但数据挖掘究竟是什么?人们常常挂在嘴边的数据挖掘建模本质上又指的什么?笔者得到的反馈常是模棱两可、凌乱抽象的时髦词汇的堆砌。本文及后续的系列专栏文章无意也无力于澄清所有的概念,仅作为抛砖引玉,为渴望入门或跟作者一样曾经陷于学界高深莫测的概念泥潭中不能自拔的理想青年尽微薄之力。我将从以下五个方面探讨。
   (一)数据挖掘是什么
   (二)数据挖掘不是什么
   (三)数据挖掘建模的任务
   (四)数据挖掘建模的思维框架
   (五)数据挖掘VS统计学
后序将介绍数据挖掘常用的研究方法;建模的技巧;常用的工具;权威的教材与论文及该领域目前活跃的研究人员。

(一)数据挖掘是什么
定义某个名词特别是某个学科总是特别容易引起争论的事情,不同的教材、不同的学者从不同的关注角度和研究领域出发总会侧重不同的理解。为了不纠缠于细枝末节,我引用了David Hand在“Principles of Data Mining”中的定义:
   数据挖掘就是对观测到数据集合进行分析,目的是发现未知的关系和以数据拥有者可以理解并对其有价值的新颖方式来总结数据。

注脚:上述定义中有几个问题需要思考。第一,对观测到的数据进行分析。什么样的数据?如何分析?化学试验的数据及分析也是观测到的数据及分析,这里的数据有什么不同?分析有什么特别?实际上,没什么不同,数据挖掘本身是高于具体的领域的一种方法论,物理的,化学的问题都可以套到这个定义上,用这个方法去“分析”
     第二,未知的关系。这是关键所在。如果一个模型分析得到的结果是已知的东西,那是验证。而数据挖掘重在“探索”,也就是一种unsupervised learning。我举个自己的切身例子,某次,本人的移动话费出奇地高,在朋友规劝下,索取了话费的清单,定神一看,密密麻麻叁张打印纸全是通话记录。有这么多电话吗?打给谁的。我自己都搞不清楚了,也就是说,我首先知道这里肯定有问题,但问题在哪,到底是因为哪些因素导致我这个月话费不“正常”我是不清楚的。在定睛一看,每天是午夜的时候都有一个同样的电话,时间点变动很小,号码偶尔变化,但稀奇古怪,拿朱笔重重一圈,再看,问题就清楚了。(略去若干字......)
    第三,以数据拥有者可以理解并对其有价值的新颖方式来总结数据。通俗一点说,就是最终的模型还得回归到具体问题来展示其结果。比如,无论你是聚类算法还是分类算法,还是关联规则分析,最终无非要回答:哪些商品售出的时候最有可能也售出其它哪些商品?哪些人最容易买了手机很快又换?
   文章结束的时候讲一个笑话,笔者的一个朋友,为某大型通迅公司作一个数据挖掘项目时,分析得出这样一个结论:16-24岁年龄段的人最容易流失。聪明的读者,你笑了吗?为什么笑?
   待续.....



 
从今以后 @ 2004-10-22 15:41

一、简介

Java 2D API是JFC (Java Fundation Classes)的一员,加强了传统AWT( Abstract Windowing Toolkit )的描绘功能。在 JDK1.2中已经支援 Java 2D 的使用。透过Java 2D API ,Programmer 可以轻松地描绘出任意的几何图形、运用不同的填色效果、对图形做旋转( rotate)、缩放( scale)、扭曲( shear)等。如图一所示,Programmer 透过2D API所提供的功能,简单地利用不同类型的线或是填色效果绘出统计图,以区分出不同的资料。当然, 2D API还有许多增强AWT能力的部分,像是处理影像档案可以有不同的滤镜(filter)效果、对於任意的几何图形亦能做碰撞侦测(hit detection)、图形重叠混色计算(composite)等功能。文中将会对这些技术做概略性地介绍。



二、Java 2D API Packages

JDK1.2中关於2D API的Packages如下所述:

2.1 java.awt

java.awt包含了一些新增的2D API 类别(classes)和介面(interfaces )。其中 Graphics2D继承自 java.awt.Graphics ,是描绘2D图形的物件(object)。如同前版本的JDK所使用的绘图模式一样,当有物件 要被描绘时,paint或是update method会自动根据适当的 Graphics Context 来做绘图的工作。所谓的Graphics Context是与 Graphics Object相关状态属性(state attribute)的集合。在Graphics2D中新增了许多状态属性,像是Stroke、 Paint、Clip、 Transform等。

2.2 java.awt.geom

java.awt.geom 则包含可以勾勒任何形状的 GeneralPath类别。它可以由许多不同种类的subpath构成,像是lines和 quadratic curves 等。为了兼顾方便性,此package中更定义了许多基本几何图形,包括Arc2D 、CubicCurve2D、 Line2D等。这些类别都有两种型态,分别是Float precision与Double precision。此外,还有一种特别的图形类别:Area,它支援Constructive Area Geometry( CGA)。CGA是对既有图形物件做布林运算(Boolean Operation)而产生新图形物件的过程。如图二所示, Areas支援联集( union)、交集( intersection)、差集(subtraction )、Exclusive OR (XOR)等布林运算。最後, AffineTransform 类别则提供图形物件做Scale、Shear 、Rotate等座标上的转换。


2.3 java.awt.font

java.awt.font 中定义了 TextLayout类别,负责建构text shape、执行适当的 text operations,如碰撞侦测与打光 (highlighting)等,以及决定text的适当位置与顺序。

2.4 java.awt.image

Java 2D API支援三种影像模式。包括 producer/consumer (push) model、 immediatemode model和 pipeine(pull) model。Push model 在前版本的JDK中支援。而Pull model 则在即将出现的 Java Advanced Imaging AP中会支援。於此,我们只探讨JDK1.2中出现的Immediate mode imaging model。在此model下, Programmer可以透过2D API对image data( BufferedImage or Raster)做滤镜的效果。在Package java.awt.image中,immediate mode imaging APIs 可以被归为六大类: interfaces、image data classes、 image operation classes、sample model classes、 color model classes和 exceptions。其中 operation classes 即定义了许多 filter ,包括了 AffinTransformOp 、BandCombineOp、 ColorConvertOp、 ConvolveOp、 LookupOp、 RescaleOp等。透过以上所提之滤镜,可以做到 geometrically transform、blur、 sharpen、enhance contrast、 threshold和color correct images等效果。如图三所示,source image经过filter,产生出新的图形。


2.5 java.awt.color

Package java.awt.color定义了class ColorSpace。此 class提供 Programmer转换色盘的method。

2.6 java.awt.print

Java Printing API提供Programmer 列印AWT和Java 2D graphics(composit ed graphics和 images)的method。并可让User设定 print的属性,如双面列印等。

三、Java 2D Programming初步

 解了Java 2D API 各相关的package资讯之後,可以进一步地实做一些简单的Applications来体认2D的美妙。在那之前,我们先学习一些基本的2D programming codes 。

3.1基本步骤

绘图的第一个步骤是产生 Graphics2D Object 。 接著是设定你所 要的状态属性。例如你想要对一物件做渐层式的填色,可以设定属性 Paint为 GradientPaint。最後再呼叫 Graphics2D所提供的redering method ,fill或是draw,完成整个绘图的程序。以下即是此基本步骤的范例程式码:




import java.awt.*;

import java.awt.geom.*;

public void paint(Graphics g)
{
 Ellipse2D.Float shape;
 GradientPaint gp;
 // create a Graphics2D

 Graphics2D g2 = (Graphics2D) g ;

 // create a Ellipse2D (x,y,w,h)

 shape = new Ellipse2D.Float (200,200,60,60);

 // create a Cyclic GradientPaint

 // (x1,y1,color1,x2,y2,color2, boolean cyclic)

 gp = new GradientPaint (180,190,Color.yellow,220,210,Color.red,true);

 g2.setPaint(gp);

 g2.fill(shape);

}



3.2 如何画线

在jdk尚未支援 2D图形之前, Programmer只可以画出直的、相同粗细的线条。现在,我们就教您如何透过2D API绘出不同粗细的线条及圆滑的曲线。在package java.awt.geom中提供了Line2D、 QuadCurve2D及 CubicCurve2D等 classes,让 Programmer轻松地绘出想要的线条。范例程式码如下所示:



import java.awt.geom.*;

Line2D.Float line;

CubicCurve2D.Float cubic;

// create a Line2D

line = new Line2D.Float(20,390,200,390);

// create a CubicCurve2D,比直线多了两个控制点

cubic = new CubicCurve2D.Float(70,100,120,50,170,270,220,100);

// 设定描绘的粗细

g2. setStroke(new BasicStroke(2.0f));

g2.setColor(Color.blue);

g2.draw(line);

line = new Line2D.Float(30,400,250,400);

// 设定描绘的粗细

g2. setStroke(new BasicStroke(5.0f));

g2.draw(line);


3.3显示字串

透过Java 2D, Programmer可以显示更细致的文字。如范例程式码的效果:显示出外边为淡蓝色的字串 " Font Test "。


import java.awt.font.*;


Shape sha;

FontRenderContext frc =g2.getFontRenderContext();

TextLayout tl = new TextLayout("Font Test",new Font("Modern",
                                    Font.BOLD+Font.ITALIC,20),frc);

sha=tl.getOutline(AffineTransform.getTranslateInstance(50,380));

g2.setColor(Color.blue);

g2.setStroke(new BasicStroke(2.0f));

g2.draw(sha);

g2.setColor(Color.white);

g2.fill(sha);


3.4图档处理

之前,若希望图形有滤镜的效果,必须透过可以处理图形的绘图软体来帮忙。在2D API中则提供了一些简单的method,使得 Programmer可以直接用程式码来对图形作滤镜效果的控制。下面即介绍其中一种效果。范例程式码如下所示:


float[] elements = {0.0f, -1.0f, 0.0f,-1.0f, 4.f, -1.0f,0.0f, -1.0f, 0.0f};

Image img = Toolkit.getDefaultToolkit().getImage("boat.gif");

int w = img.getWidth(this);
int h = img.getHeight(this);

BufferedImage bi = new BufferedImage(w,h,BufferedImage.TYPE_INT_RGB);

Graphics2D big = bi.createGraphics();

big.drawImage(img,0,0,this);

BufferedImageOp biop = null;

AffineTransform at = new AffineTransform();

BufferedImage bimg = new BufferedImage(img.getWidth(this),img.getHeight(this),
                      BufferedImage.TYPE_INT_RGB);

Kernel kernel = new Kernel(3,3,elements);

ConvolveOp cop = new ConvolveOp(kernel,ConvolveOp.EDGE_NO_OP,null);

cop.filter(bi,bimg);

biop = newAffineTransformOp(at,AffineTransformOp.TYPE_NEAREST_NEIGHBOR);

g2 = (Graphics2D)this.getGraphics();

g2.drawImage(bimg,biop,0,0);





四、参考资料
[1] Java Tutorial-2D Graphics-,http://java.sun.com/docs/books/tutorial/2d/index.html
[2] Java 2D Progrmmer's Guide,Chapter 3-Geometries- http ://java.sun.com/p roducts/jdk/1.2/d ocs/guide/2d/spec /j2d-geom.fm2.htm l
[3] [3]Java 2D Programmer;s Guide,Chapter 5-imaging- htt p://java.sun.com/ products/jdk/1.2/ docs/guide/2d/spe c/j2d-image.fm2.h tml



 
日历
网志文件夹
『所有网志』
==Study==
==Entertain==
==Private==
==Other==
最新留言
站内搜索
友情链接
管理博客
订阅 RSS
0013702
歪酷博客