Orange的数据挖掘聚类简单小实验(K-means)

Orange不可能全部介绍,只能去阅读官方资料。这里就做一个聚类的小实验,把实验过程中的问题总结起来,避免后面的人走弯路。记录实验的目的,绝对不仅仅是证明成功,更是提醒后来者实验的问题,去解决重现实验的问题,这才是正确的态度。我选取的小实验主题为聚类分析,专门是层次聚类。
3.1 在小实验之前的内容

在说到聚小实验类之前,不得不提到Orange可以作为模块导入python,因此不仅可以使用可视化操作,还可以使用代码脚本验证。这些作为模块的官方说明文档,都可以去阅读,下面总结几个:

(1)关于官方数据输入(DATA Input)的代码导入和代码DEMO说明非常有用,解释了如何使用Orange的标准库来制作TAB数据,这是非常方便的。

(2)既然要聚类,必然要选择聚类距离准则,关于官方网址提供计算距离(Distance)的方法和模块接口可以参看超链接。官方提供的例程非常容易理解,非常好用,非常好验证。

(3)聚类选择了层次聚类,可以参看官方提供的层次聚类(Hierarchical Clustering)的模块接口和代码DEMO。
3.2 数据格式的制作

在这里,我目前还在学习Orange 的标准库制作TAB的方法,还没有完全学会,因此就不提前撰写相关的知识了(笔者注:貌似我犯了错误,我没有发现Orange提供标准库,好像它没有制作TAB的标准库,看来还是要自己去制作)。使用Python写TAB的数据是非常方便,比起C语言来,真的是很快速迅捷。本实验的时候,制作的时候需要提醒几点,并举一个例子:

TAB的数据格式设计问题(请具体问题具体分析,我下面这个例子的解决方法也是具体的,不是广泛适用的)

如果我分析的数据对象是一个DNA序列数据,请注意数据格式需要如下书写:

No1<\t>No2<\t>No3<\t>No4<\t>No5<\t>Order<\r\n>

d<\t>d<\t>d<\t>d<\t>d<\t>c<\r\n>

<\r\n>

G<\t>G<\t>T<\t>C<\t>G<\t>1<\r\n>

G<\t>T<\t>A<\t> T<\t>C<\t>2<\r\n>

……

No1<\t>No2<\t>No3<\t>No4<\t>No5<\t>Order<\r\n>

d<\t>d<\t>d<\t>d<\t>d<\t>d<\r\n>

<\t><\t><\t><\t><\t>class<\r\n>

G<\t>G<\t>T<\t>C<\t>G<\t>1<\r\n>

G<\t>T<\t>A<\t> T<\t>C<\t>2<\r\n>

……

上述例子应该都可以使用,之前我都验证过是可以使用的,只不过不报错,但不一定符合你的使用聚类计算。

两个的属性是五个碱基,加上一个序列的编号。尽管Orange会内置编号,但是我不知道如何使用,并且使用自己的编号,利于数据库管理。

上述左侧请注意,如果不对属性进行元信息的标注,那么空出一行,什么也不要写。

上述右侧请注意,如果标注了class,Order一定要离散的,否则可能报错(好像我实验的时候报错了)。标注class 的话,没有必要空出额外的一行。(补充,如果空了一行,但是不标注class,有时也报self.list out of range的溢出,但是仍然可以跑数据。这极可能是如果你不标注class,又空出了一行,但是你那一行带入不可见的字符,如空格或缩进,你空出的那一行必须只能是简简单单的回车换行。否则会出问题。)

但是不论上述两种设计数据格式,Order很有可能会出现问题,原因是:

(1)对于程序内部来说,聚类需要计算距离,如果属性不是需要计算距离的,结果被带进去计算,导致结果是错误的。

详细情况:上述左侧,如果Order不去注明class(表示忽略该属性),则Order的数值带入计算,影响聚类。

解决方式:对于计算距离的情形,非计算属性可以标记为c,也可以标记s,尽量不标记d。如果标记d,可以注明该属性为class,或许可以不带入运算。(补充:此为后续实验的体会)

(补充:)不论是连续型,还是离散型。Orange的tab数据投入到聚类距离计算时,凡绝对值不是0和1,即大于等于2或小于等于-2,都会被程序认为是1。所以多维属性的数值一般为0或1。如果不参与计算的属性,如序列编号等,尽量不要带入计算中。所以要么使用class注释不想参与计算的数据(注意,class只能使用一次,所以建议使用标注string来处理),要么使用string属性。这是后续实验的体会。

(2)对于人来说,聚类结果需要输出,需要可视化的观察,需要编号的显示,但是Orange可能会出现一定问题。

详细情况:上述右侧,如果Order注明了class,则在层次聚类的时候,忽略掉了该属性,自动的remove掉了,导致层次聚类后,我不知道哪条序列是原来总体集合的顺序第几条?(补充:笔者此处语句不严谨,可能有问题。后续的进一步实验觉得这句话是不正确的。)

综上所述,而上述的情况,常常见于入门知识,官方引言。因此这里摸索到使用string,则不会参与计算的方法。即给Order赋予string(缩写为s),依然给1,2,3等编号,既可以层次聚类的时候观察编号,也可以不参与聚类距离的计算。验证方式为:

我新建一个数据,并有四个序列,分别为(这里不给出TAB的完整格式了,就给出随便的格式了,主要是给序列内容):

S1 S2 S3 S4 S5 S6 S7 S8 Order

discrete discrete discret discrete discrete discrete discret discrete string

1 1 1 1 1 1 1 1 1

1 1 1 1 1 1 1 0 300

0 0 0 0 0 0 0 1 2

0 0 0 0 0 0 0 0 4000

如果string的数值参与影响,必定影响层次聚类的距离计算,但是结果输出为如下:

编号1与编号300的聚成一起,既说明没有影响,而且在层次聚类的图后还能看见编号。(如果使用class,是在上图中看不到编号的,手动则左侧栏也是找不到调不出属性的,因为class的属性被忽略掉了。)
3.3 层次聚类的实验过程

聚类的过程非常简单,因为都是可视化操作。可视化操作的图标都在左侧栏里,都可以找到。

(1)建立FILE,点选FILE图标,拖动放置画布上。

打开FILE,可以读取TAB数据,选中所要读取的文件(已经制作好的TAB数据文件)

读取后,需要显示数据,然后选择DATA栏目里的第二行第一个,Data Table图标,拖放至画布中,然后从FILE图标的右侧引出一根线,可以连接Data Table。

则在Paint Data里可以显示数据了,显示情况如下。

同时注意,在显示的时候,是看不到Order的属性,但是如果是class属性,默认会是灰色的,自己试试就知道了。

看到上图左下角有一个commit on any change是用于修改数据后,重新保存提交,重新运行的操作按钮。不要选上钩,因为"不选钩"的操作就是每一步操作如果影响了数据,立刻就会投入到后续生产线(这里我将整个聚类的完整过程比喻成生产线),为避免牵一发动全身。建议不要勾上,使用手动提交的方式,便于生产线根据人的意志去调节调试。

(2)由于我们的主题是层次聚类,但是层次聚类之前需要计算距离。因此接下来,将Paint Data送入距离计算模块,选择不带任何标记的纯粹的三角形状的Distance(在Unsupervised里有纯粹三角形的Distance)。

下图因为我已经做了实验,就不重头一个一个拖放了,就指出下面红色框内的为distance模块。同时,从Data Table图标引出一条线接上Distance。

双击点开Data Table图标,弹出的菜单左下角点击send selections。这样数据就被送入到distance了。在distance中可以选择距离公式,默认是欧式距离。

如果你需要更换公式,可以在Distance Metric一栏,选择完其他的公式,点击commit,然后再由Data Table送入数据,重新计算。

请注意,发送数据(send selection)是需要你选择数据的,即可以使用鼠标拉选EXCEL那样。如果你发送全部数据,也应该是需要手动选择的,如果数据太多,不想鼠标拉选,可以像下图一样,下图红框处,双击即可全选,然后发送数据即可。如果你发送数据(send selection)没有任何反应,很有可能就是你没有选择数据。没有选择数据,送出去是空数据。

(3)然后是层次聚类,在Unsupervised栏目的第二行第三个,选择层次聚类图标,然后拖放至白布上。从distance图标引出一根线,连接层次聚类的图标。

当把数据送过去后,如果数据很多的话,可以看到distance图标在环形缓冲,这个显示效果做的很赞(上图是如果数据很多的情况,distance环形缓冲的示意)。打开层次聚类后,发现生成了系谱树。

上图右侧是阈值,拖动阈值阀门,可以显示不同的聚类数目。

上图左侧三个红框,分别指距离准则,属性显示,标注额外属性。

第一个,距离准则,有如下的选择。

这几个选择从上到下分别是最小距离,平均距离,最小方差距离,最大距离。(想学习具体方法,可以参看百度文库,文档贡献网友627004473的上传文档《聚类分析PDF》,在第29页)

一般序列计算距离还是选择类平均法比较法,因此选择它average linkage。

第二个,属性显示。就是我之前提到的,如果想在聚类图谱中看到序列所属的编号,如果使用class,annotation里会没有Order,所以使用string属性,可以解决这个问题。现在谱图中就出现了编号,如下图。

第三个额外标注,是为了写出聚类内样本内容,需要标注一下序列所属的类的类号。通过额外写入,方便样本保存的时候,里面会有类标记。建议勾选,并自己起一个名字。

(4)层次聚类结束后,需要把数据导出,则分别拖放selected data和save,如下图所示。

请注意,你的selected data是空白的,请双击层次聚类的图标,在弹出的菜单左下角,点击commit,提交你的操作变化。这样内部程序发现变化,随即将数据传入selected data。然后你可按照自己的属性去提取对应的数据。如下图所示,我按照Order编号所在的聚类类号,保存我想要的数据,同时我还知道聚类划分的数据属于原集合的第几条数据。由于在层次聚类的界面,有一个append cluster ID之前介绍过了,勾选上,则在selected data中会多出一个类号的属性。下图中HierarCluster是我在层次聚类的图中,append cluser ID命名新增所致。

save的图标则在上图的上图中,用于存储数据。首先在上图的基础上,产生规则,如下图所示。

在上图中,定义HierarCluster属于Cluster1的样本,点击add,在规则区就产生了样本,data out区域也注明了样本数和特征数。此时把save图标拖出,回过来将select data打开,勾选(active)想要的数据样本,点击commit提交,就会传到save里。最后双击SAVE图标,在弹出的的菜单中,再保存数据即可,如下图所示。

3.4 本实验的不足

局限于目前接受学习的水平,还没足够的时间掌握orange的数据挖掘资料,本实验有以下不足:

解决tab文件的部分数据格式概念知识,仍有一部分未解决。如除离散值和连续值,class,string外还有什么属性?离散和连续的区别在哪里?(这个问题我参阅《数据挖掘概念与技术》一书29页,第二章2.1.6小节关于离散属性和连续属性的问题,但是仍然不解)
层次聚类有没有评估性能的模块?如召回率等。便于解决k-means的性能评价问题。也利于完成学术的基本实验证明。

本实验的特色特点在于:

(1)Orange的接口简单易行,它的模块类有demo可追溯,入手较快。

(2)全过程可视化操作,极其简单,在操作上胜于WEKA

(3)Orange的聚类分析虽没有WEKA参数全面,但独具特点,含有信息预测的模块,也非常有特色。
转载于:https://www.cnblogs.com/bitpeach/p/4178544.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值