Presentation is loading. Please wait.

Presentation is loading. Please wait.

数据挖掘工具 WEKA教程 广东外语外贸大学 杜剑峰.

Similar presentations


Presentation on theme: "数据挖掘工具 WEKA教程 广东外语外贸大学 杜剑峰."— Presentation transcript:

1 数据挖掘工具 WEKA教程 广东外语外贸大学 杜剑峰

2 WEKA教程 WEKA简介 课程的总体目标和要求: 数据格式 熟悉WEKA的基本操作,了解WEKA的各项功能 数据准备 属性选择
可视化分析 分类预测 关联分析 聚类分析 扩展WEKA 课程的总体目标和要求: 熟悉WEKA的基本操作,了解WEKA的各项功能 掌握数据挖掘实验的流程 准备数据 选择算法和参数运行 评估实验结果 了解或掌握在WEKA中加入新算法的方法

3 1、WEKA简介 WEKA的全名是怀卡托智能分析环境(Waikato Environment for Knowledge Analysis),其源代码可从 2005年8月,在第11届ACM SIGKDD国际会议上,怀卡托大学的WEKA小组荣获了数据挖掘和知识探索领域的最高服务奖, WEKA系统得到了广泛的认可,被誉为数据挖掘和机器学习历史上的里程碑,是现今最完备的数据挖掘工具之一。 WEKA的每月下载次数已超过万次。

4 1、WEKA简介(续) 作为一个大众化的数据挖掘工作平台, WEKA集成了大量能承担数据挖掘任务的机器学习算法,包括对数据进行预处理、分类、回归、聚类、关联分析以及在新的交互式界面上的可视化等等。通过其接口,可在其基础上实现自己的数据挖掘算法。 WEKA的界面

5 2、数据格式 WEKA所用的数据格式( 跟Excel一样) Explorer界面 Open file… Edit…

6 2、数据格式(续) WEKA文件相关术语 表格里的一个横行称作一个实例(Instance),相当于统计学中的一个样本,或者数据库中的一条记录。竖行称作一个属性(Attribute),相当于统计学中的一个变量,或者数据库中的一个字段。这样一个表格,或者叫数据集,在WEKA看来,呈现了属性之间的一种关系(Relation)。上图中一共有14个实例,5个属性,关系名称为“weather”。 WEKA存储数据的格式是ARFF(Attribute-Relation File Format)文件,这是一种ASCII文本文件。上图所示的二维表格存储在如下的ARFF文件中。这也就是WEKA自带的“weather.arff”文件,在WEKA安装目录的“data”子目录下可以找到。

7

8 2、数据格式(续) 文件内容说明 识别ARFF文件的重要依据是分行,因此不能在这种文件里随意的断行。空行(或全是空格的行)将被忽略。 以“%”开始的行是注释,WEKA将忽略这些行。如果你看到的“weather.arff”文件多了或少了些“%”开始的行,是没有影响的。 除去注释后,整个ARFF文件可以分为两个部分。 第一部分给出了头信息(Head information),包括了对关系的声明和对属性的声明。 第二部分给出了数据信息(Data

9 2、数据格式(续) 关系声明 关系名称在ARFF文件的第一个有效行来定义,格式为 @relation <relation-name> <relation-name>是一个字符串。如果这个字符串包含空格,它必须加上引号(指英文标点的单引号或双引号)。

10 2、数据格式(续) 属性声明 这些声明语句的顺序很重要。首先它表明了该项属性在数据部分的位置。例如,“humidity”是第三个被声明的属性,这说明数据部分那些被逗号分开的列中,第三列数据 是相应的“humidity”值。其次,最后一个声明的属性被称作class属性,在分类或回归任务中,它是默认的目标变量。 属性声明的格式为 @attribute <attribute-name> <datatype> 其中<attribute-name>是必须以字母开头的字符串。和关系名称一样,如果这个字符串包含空格,它必须加上引号。

11 2、数据格式(续) WEKA支持的<datatype>有四种
numeric 数值型 <nominal-specification> 标称(nominal)型 string 字符串型 date [<date-format>] 日期和时间型 其中<nominal-specification> 和<date-format> 将在下面说明。还可以使用两个类型“integer”和“real”,但是WEKA把它们都当作“numeric”看待。注意“integer”,“real”,“numeric”,“date”,“string”这些关键字是区分大小写的,而“relation”、“attribute ”和“data”则不区分。

12 2、数据格式(续) 数值属性 数值型属性可以是整数或者实数,但WEKA把它们都当作实数看待。
标称属性 标称属性由<nominal-specification>列出一系列可能的类别名称并放在花括号中:{<nominal-name1>, <nominal-name2>, <nominal-name3>, ...} 。数据集中该属性的值只能是其中一种类别。 例如如下的属性声明说明“outlook”属性有三种类别:“sunny”,“ overcast”和“rainy”。而数据集中每个实例对应的“outlook”值必是这三者之一。 @attribute outlook {sunny, overcast, rainy} 如果类别名称带有空格,仍需要将之放入引号中。

13 2、数据格式(续) 字符串属性 字符串属性中可以包含任意的文本。这种类型的属性在文本挖掘中非常有用。 示例: @ATTRIBUTE LCC string 日期和时间属性 日期和时间属性统一用“date”类型表示,它的格式是 @attribute <name> date [<date-format>] 其中<name>是这个属性的名称,<date-format>是一个字符串,来规定该怎样解析和显示日期或时间的格式,默认的字符串是ISO-8601所给的日期时间组合格式“yyyy-MM-ddTHH:mm:ss”。 数据信息部分表达日期的字符串必须符合声明中规定的格式要求(下文有例子)。

14 2、数据格式(续) 数据信息 每个实例占一行。实例的各属性值用逗号“,”隔开。如果某个属性的值是缺失值(missing value),用问号“?”表示,且这个问号不能省略。例如: @data sunny,85,85,FALSE,no ?,78,90,?,yes

15 2、数据格式(续) 字符串属性和标称属性的值是区分大小写的。若值中含有空格,必须被引号括起来。例如:
@relation LCCvsLCSH LCC string LCSH string   AG5, 'Encyclopedias and dictionaries.;Twentieth century.'   AS262, 'Science -- Soviet Union -- History.'

16 2、数据格式(续) 日期属性的值必须与属性声明中给定的相一致。例如:
@RELATION Timestamps timestamp DATE "yyyy-MM-dd HH:mm:ss"   " :12:12"   " :59:55"

17 3、数据准备 数据文件格式转换 使用WEKA作数据挖掘,面临的第一个问题往往是我们的数据不是ARFF格式的。幸好,WEKA还提供了对CSV文件的支持,而这种格式是被很多其他软件,比如Excel,所支持的。现在我们打开“bank-data.csv”。 利用WEKA可以将CSV文件格式转化成ARFF文件格式。ARFF格式是WEKA支持得最好的文件格式。 此外,WEKA还提供了通过JDBC访问数据库的功能。 “Explorer”界面 “Explorer”提供了很多功能,是WEKA使用最多的模块。现在我们先来熟悉它的界面,然后利用它对数据进行预处理。

18 3、数据准备(续) bank-data数据各属性的含义如下: id: a unique identification number age: age of customer in years (numeric) sex: MALE / FEMALE region: inner_city/rural/suburban/town income: income of customer (numeric) married: is the customer married (YES/NO) children: number of children (numeric) car: does the customer own a car (YES/NO) save_act: does the customer have a saving account (YES/NO) current_act:does the customer have a current account (YES/NO) mortgage: does the customer have a mortgage (YES/NO) pep: did the customer buy a PEP (Personal Equity Plan,个人参股计划) after the last mailing (YES/NO)

19 1 2 3 4 6 5 7 8

20 3、数据准备(续) 上图显示的是 “Explorer”打开“bank-data.csv”的情况。我们根据不同的功能把这个界面分成8个区域。
区域1的几个选项卡是用来切换不同的挖掘任务面板。这一节用到的只有“Preprocess”,其他面板的功能将在以后介绍。 区域2是一些常用按钮。包括打开数据,保存及编辑功能。我们可以在这里把“bank-data.csv”另存为“bank-data.arff”。 在区域3中“Choose”某个“Filter”,可以实现筛选数据或者对数据进行某种变换。数据预处理主要就利用它来实现。 区域4展示了数据集的一些基本情况。

21 3、数据准备(续) 区域5中列出了数据集的所有属性。勾选一些属性并“Remove”就可以删除它们,删除后还可以利用区域2的“Undo”按钮找回。区域5上方的一排按钮是用来实现快速勾选的。在区域5中选中某个属性,则区域6中有关于这个属性的摘要。注意对于数值属性和标称属性,摘要的方式是不一样的。图中显示的是对数值属性“income”的摘要。 区域7是区域5中选中属性的直方图。若数据集的最后一个属性(这是分类或回归任务的默认目标变量)是类标变量(这里的“pep”正好是),直方图中的每个长方形就会按照该变量的比例分成不同颜色的段。要想换个分段的依据,在区域7上方的下拉框中选个不同的分类属性就可以了。下拉框里选上“No Class”或者一个数值属性会变成黑白的直方图。 区域8是状态栏,可以查看Log以判断是否有错。右边的weka鸟在动的话说明WEKA正在执行挖掘任务。右键点击状态栏还可以执行JAVA内存的垃圾回收。

22 3、数据准备(预处理1) 去除无用属性 通常对于数据挖掘任务来说,ID这样的信息是无用的,我们将之删除。在区域5勾选属性“id”,并点击“Remove”。将新的数据集保存为“bank-data.arff”,重新打开。 接下来演示“RemoveType”。 离散化 我们知道,有些算法(如关联分析),只能处理所有的属性都是标称型的情况。这时候我们就需要对数值型的属性进行离散化。在这个数据集中有3个变量是数值型的,分别是“age”,“income”和“children”。 其中“children”只有4个取值:0,1,2,3。这时我们直接修改ARFF文件,把 @attribute children numeric 改为 @attribute children {0,1,2,3} 就可以了。 在“Explorer”中重新打开“bank-data.arff”,看看选中“children”属性后,区域6那里显示的“Type” 变成“Nominal”了。

23 3、数据准备(预处理2) 离散化(续) “age”和“income”的离散化可借助WEKA中名为“Discretize”的Filter来完成。在区域2中点“Choose”,出现一棵“Filter树”,逐级找到“weka.filters.unsupervised.attribute.Discretize”,点击。 现在“Choose”旁边的文本框应该显示“Discretize -B 10 -M R first-last”。 点击这个文本框会弹出新窗口以修改离散化的参数。 我们不打算对所有的属性离散化,只是针对对第1个和第4个属性(见区域5属性名左边的数字),故把attributeIndices右边改成“1,4”。计划把这两个属性都分成3段,于是把“bins”改成“3”。其它框里不用更改。点“OK”回到“Explorer”,可以看到“age”和“income”已经被离散化成分类型的属性。若想放弃离散化可以点区域2的“Undo”。 经过上述操作得到的数据集我们保存为bank-data-final.arff。

24 3、数据准备(预处理3) 属性类型转换 NominalToBinary过滤器将所有nominal类型的属性转为binary(0,1二值)属性,一个可取k个值的nominal类型的属性转为k个二值属性,这样可将数据中所有属性转为数值(numeric)属性。以下是weather.arff转换后的结果。

25 3、数据准备(预处理4) 增加一个表达式属性 AddExpression: An instance filter that creates a new attribute by applying a mathematical expression to existing attributes. The expression can contain attribute references and numeric constants. Supported operators are : +, -, *, /, ^, log, abs, cos, exp, sqrt, floor, ceil, rint, tan, sin, (, ) Attributes are specified by prefixing with 'a', eg. a7 is attribute number 7 (starting from 1). Example expression : a1^2*a5/log(a7*4.0). 以下命令在weather.arff中增加了一个temp/hum属性,其值为第二个属性(temperature)除以第三个属性(humidity)的值。 AddExpression –E a2/a3 –N temp/hum

26 3、数据准备(预处理5) 采样 使用weka.filters.supervised.instance.Resample对整个数据集进行分层的采样(stratified subsample,采样所得数据仍保持原来的类分布)。以下Filter命令从soybean.arff中采样了5%的数据。 Resample –B 1.0 –S 1 –Z 5.0 使用weka.filters.unsupervised.instance.Resample 进行不分层的采样,即与类信息无关。以下Filter命令从soybean.arff中采样了5%的数据。 Resample –S 1 –Z 5.0

27 4、属性选择 两种属性子集选择模式 属性子集评估器 + 搜索方法 单一属性评估器 + 排序方法

28 4.1 属性选择模式1 属性子集评估器 搜索方法 CfsSubsetEval: 综合考虑单一属性的预测值和属性间的重复度
BestFirst: 回溯的贪婪搜索 ExhaustiveSearch: 穷举搜索 GeneticSearch: 使用遗传算法搜索 GreedyStepwise: 不回溯的贪婪搜索 RaceSearch: 竞争搜索 RandomSearch: 随机搜索 RankSearch: 排列属性并使用属性子集评估器将有潜力的属性进行排序 属性子集评估器 CfsSubsetEval: 综合考虑单一属性的预测值和属性间的重复度 ClassifierSubsetEval: 用分类器评估属性集 ConsistencySubsetEval: 将训练数据集映射到属性集上来检测类值的一致性 WrapperSubsetEval: 使用分类器和交叉验证

29 4.2、属性选择模式2 单一属性评估器 排序方法 ChiSquaredAttributeEval: 以基于类的Χ2为依据的属性评估
GainRationAttributeEval: 以增益率为依据的属性评估 InfoGainAttributeEval: 以信息增益为依据的属性评估 OneRAttributeEval: 以OneR的方法论来评估属性 PrincipleComponents: 进行主成分的分析和转换 ReliefAttributeEval: 基于实例的属性评估器 SymmetricalUncertAttributeEval: 以对称不确定性为依据的属性评估 排序方法 Ranker: 按照属性的评估对它们进行排序

30 5、可视化分析 二维散列图 选择类标 改变点阵的大小和点的大小 改变抖动度,使互相重叠的点分开 选择属性子集和采样
标称类标:数据点的颜色是离散的 数值类标:数据点的颜色用色谱(蓝色到橙色)表示 改变点阵的大小和点的大小 改变抖动度,使互相重叠的点分开 选择属性子集和采样 注意:必须点击Update按钮上述改动才能生效

31 6、分类预测 WEKA把分类(Classification)和回归(Regression)都放在“Classify”选项卡中。

32 选择分类算法 WEKA中的典型分类算法 Bayes: 贝叶斯分类器 Functions: 人工神经网络和支持向量机
BayesNet: 贝叶斯信念网络 NaïveBayes: 朴素贝叶斯网络 Functions: 人工神经网络和支持向量机 MultilayerPerceptron: 多层前馈人工神经网络 SMO: 支持向量机(采用顺序最优化学习方法) Lazy: 基于实例的分类器 IB1: 1-最近邻分类器 IBk: k-最近邻分类器

33 选择分类算法 Meta: 组合方法 Rules: 基于规则的分类器 Trees: 决策树分类器
AdaBoostM1: AdaBoost M1方法 Bagging: 袋装方法 Rules: 基于规则的分类器 JRip: 直接方法-Ripper算法 Part: 间接方法-从J48产生的决策树抽取规则 Trees: 决策树分类器 Id3: ID3决策树学习算法(不支持连续属性) J48: C4.5决策树学习算法(第8版本) REPTree: 使用降低错误剪枝的决策树学习算法 RandomTree: 基于决策树的组合方法

34 选择模型评估方法 四种方法 完全使用训练集 使用外部的检验集 交叉验证 设置折数 保持方法 设置训练实例的百分比 其他设置 设置代价矩阵

35 文字结果分析 窗口显示的文字结果信息: 运行信息 使用全部训练数据构造的分类模型 针对训练/检验集的预测效果汇总 基于类的详细结果 混淆矩阵
k-折交叉验证的结果是k次实验的汇总 即 TP=TP1+…+TPk, FN=FN1+…+FNk, FP=FP1+…+FPk, TN=TN1+…+TNk 基于类的详细结果 加权平均的系数是类大小的百分比 混淆矩阵

36 图形结果分析 可视化分类错误 可视化模型 实际类与预测类的散布图 可视化图:贝叶斯网络 可视化树:决策树 查看条件概率表 居中显示
屏幕大小显示 自动调整显示 查看结点关联的训练集

37 图形结果分析… 可视化边缘曲线 (margin curve) 显示预测边缘,即实际类的预测概率与其他类的最大预测概率的差别
对于每个检验实例,从小到大显示预测边缘 四个变量 Margin: 预测边缘的值 Instance_number: 检验实例的序号 Current: 具有当前预测边缘值的实例个数 Cumulative: 小于或等于预测边缘值的实例个数 (与Instance_number一致)

38 图形结果分析… 可视化阈值曲线(基于类) 阈值是将检验实例归为当前类的最小概率,使用点的颜色表示阈值 曲线上的每个点通过改变阈值的大小生成
可以进行ROC分析 X轴选假正率 Y轴选真正率 问题:为什么决策树也可以进行ROC分析? 可能答案:叶子不一定是纯的,存在类的概率分布

39 实验者界面 优点 缺点 三个页面 同时对多个数据集和多个分类算法工作 可以比较多个分类算法的性能 不能使用数据预处理工具
不能选择类标,只能将输入数据集的最后一个属性作为类标 三个页面 设置页面 (Setup) - 设置实验参数 运行页面 (Run) - 启动实验,监视实验过程 分析页面 (Analyze) - 分析实验结果

40 设置页面 设置实验配置模式 (Experiment Configuration Mode)
设置保存结果路径 (Choose Destination) 设置实验类型 (Experiment Type) 交叉验证 保持方法(随机化记录次序) 保持方法(未知原有记录次序) 迭代控制 (Iteration Control) 设置实验迭代次数,特别适用于保持方法 数据集 (Datasets) 增加数据集,类标是数据集最后一个属性 分类算法 (Algorithms) 增加算法 设置算法参数

41 运行页面 点击运行,报告运行情况 运行后生成一个数据集 一个记录对应一个数据集和一个分类算法的一次实验,字段包括算法、数据集和不同的性能度量
分析仅限于数值分析和显著性测试 没有可视化分析功能

42 分析页面 实验结果数据源 (Source) 配置测试 (Configure test) 结果列表 (Result list)
选择行和列,行缺省是数据集,列缺省是Scheme, Scheme_options和Scheme_version_ID 基准分类模型 (Test base) 某个输入模型 汇总 (summary) 排序 (ranking) 结果列表 (Result list) 测试输出 (Test output)

43 实验内容 分组对UCI数据集进行实验 http://archive.ics.uci.edu/ml/datasets.html 实验内容
12个组 每组选择一个数据集分析 实验内容 使用一个UCI数据集,选择任意三个分类算法 分析三个分类算法的实验结果 解释文字分析结果 解释图形分析结果 使用两个性能度量比较三个分类算法的性能差异 解释基于某个分类算法的性能比较结果 解释基于排序的性能比较结果

44 知识流界面 功能:将WEKA组件在设计画布上相互连接以形成可进行动态数据处理分析的知识流 两种数据处理模式 批量处理 增量处理
探索者界面不支持增量处理数据 目前WEKA实现了下面这些可增量学习的分类器:AODE、IB1、IBk、KStar、NaiveBayesMultinomialUpdateable、NaiveBayesUpdateable、NNge、Winnow、RacedIncrementalLogitBoost、LWL

45 批量处理模式 交叉验证J48显示 Datasources – ArffLoader Evaluation – ClassAssigner
Evaluation – CrossValidationFoldMaker Classifiers – J48 Evaluation – ClassifierPerformanceEvaluator Visualization – TextViewer Visualization – GraphViewer

46 批量处理模式 交叉验证J48显示

47 批量处理模式… 交叉验证BayesNet显示 Datasources – ArffLoader
Evaluation – ClassAssigner Evaluation – CrossValidationFoldMaker Classifiers – BayesNet Evaluation – ClassifierPerformanceEvaluator Visualization – TextViewer Visualization – GraphViewer

48 批量处理模式… 交叉验证BayesNet显示

49 增量处理模式 增量学习NaiveBayesUpdateable显示 Datasources – ArffLoader
Evaluation – ClassAssigner Classifiers – NaiveBayesUpdateable Evaluation – IncrementalClassiferEvaluator Visualization – TextViewer Visualization – StripChart Accuracy – 准确率 RMSE – 均方根误差 (root-mean-square error)

50 增量处理模式 增量学习NaiveBayesUpdateable显示

51 7、关联分析 Soybean数据的关联分析 WEKA中关联分析的过程
用“Explorer”打开“soybean.arff”后,切换到“Associate”选项卡。默认关联规则分析是用Apriori算法。 点“Choose”右边的文本框修改默认的参数,弹出的窗口中点“More”可以看到各参数的说明。 点击“Start”按钮开始关联分析。 WEKA中关联分析的过程 从数据项的最少支持度100%开始,逐步递减5%,直到至少有所要求的最小置信度为0.9的10条规则,或者支持度达到了10%的下限。

52 Apriori的有关知识 对于关联规则L->R,由支持度决定规则的统计显著性,并由四种不同的因素之一决定规则的优先度。
支持度(support)—— 同时观察到前件和后件的概率 support = Pr(L,R) 置信度(confidence)—— 出现前件时同时出现后件的概率 confidence = Pr(L,R)/Pr(L) 提升度(lift)—— 置信度与后件支持度的比率 lift = Pr(L,R) / (Pr(L)Pr(R)) 平衡度(leverage)—— 在前件和后件统计独立的假设下,被前件和后件同时涵盖的超出期望值的那部分实例的比例 leverage = Pr(L,R) - Pr(L)Pr(R) 可信度(conviction)—— 也用来衡量前件和后件的独立性 conviction = Pr(L)Pr(not R) / Pr(L,R)

53 参数设置 任务一:挖掘支持度在10%到100%之间,并且提升度超过1.5且提升度排在前100位的关联规则
“lowerBoundMinSupport”和“upperBoundMinSupport”分别设为0.1和1 “metricType”设为lift “minMetric”设为1.5 “numRules”设为100 任务二:挖掘支持度在10%到100%之间,并且置信度超过0.8且置信度排在前100位的分类关联规则 数据集为“weather.nominal.arff” “car”设为True “metricType”设为confidence (只能选confidence!) “minMetric”设为0.8

54 8、聚类分析 聚类分析是把对象分配给各个簇,使同簇中的对象相似,而不同簇间的对象相异。
WEKA在“Explorer”界面的“Cluster”提供聚类分析工具,主要算法包括: SimpleKMeans — 支持分类属性的K均值算法 DBScan — 支持分类属性的DBSCAN算法 EM — 基于混合模型的聚类算法 FathestFirst — K中心点算法 OPTICS — 基于密度的另一个算法 Cobweb — 概念聚类算法 sIB — 基于信息论的聚类算法,不支持分类属性 XMeans — 能自动确定簇个数的扩展K均值算法,不支持分类属性

55 参数设置 聚类模式 SimpleKMeans重要参数 DBScan重要参数
使用训练集 (Use training set) — 报告训练对象的聚类结果和分组结果 使用附加的检验集 (Supplied test set) — 报告训练对象的聚类结果和附加的检验对象的分组结果 百分比划分 (Percentage split) — 报告全部对象的聚类结果、训练对象的聚类结果,以及检验对象的分组结果 监督评估 (Classes to clusters evaluation) — 报告训练对象的聚类结果和分组结果、类/簇混淆矩阵和错误分组信息 SimpleKMeans重要参数 N — 簇个数 DBScan重要参数 E — Eps M — MinPts

56 结果分析 文字分析 图形分析 (必须将store clusters for visualization勾上) SimpleKMeans
非监督模式:运行信息、KMeans结果(迭代次数、SSE、簇中心)、检验对象的分组信息 监督模式:运行信息、KMeans结果(迭代次数、SSE、簇中心)、类/簇混淆矩阵、错误分组的对象个数和比例 簇中心:对于数值属性为均值,对于分类属性为众数 DBScan 非监督模式:运行信息、DBScan结果(迭代次数、各个训练对象的分组信息)、检验对象的分组信息 监督模式:运行信息、 DBScan结果(迭代次数、各个训练对象的分组信息)、类/簇混淆矩阵、错误分组的对象个数和比例 图形分析 (必须将store clusters for visualization勾上) 可视化簇指派 (Visualize cluster assignments):2D散布图,能够可视化类/簇混淆矩阵

57 WEKA小结 数据预处理 数据可视化 分类预测 关联分析 聚类分析 Explorer – Preprocess:
Explorer – Select attributes: 还可以在Preprocess页面使用属性选择方法 数据可视化 Explorer – Visualize: 二维散布图 分类预测 Explorer – Classify: Experimenter: 比较多个算法的性能 KnowledgeFlow: 批量/增量学习模式 关联分析 Explorer – Associate: 聚类分析 Explorer – Cluster:


Download ppt "数据挖掘工具 WEKA教程 广东外语外贸大学 杜剑峰."

Similar presentations


Ads by Google