2023-02-21 03:27来源:m.sf1369.com作者:宇宇
1. 数据预处理,
2. 为衡量数据点间的相似度定义一个距离函数,
3. 聚类或分组,
4. 评估输出。
数据预处理包括选择数量,类型和特征的标度,它依靠特征选择和特征抽取,特征选择选择重要的特征,特征抽取把输入的特征转化为一个新的显著特征,它们经常被用来获取一个合适的特征集来为避免“维数灾”进行聚类,数据预处理还包括将孤立点移出数据,孤立点是不依附于一般数据行为或模型的数据,因此孤立点经常会导致有偏差的聚类结果,因此为了得到正确的聚类,我们必须将它们剔除。
既然相类似性是定义一个类的基础,那么不同数据之间在同一个特征空间相似度的衡量对于聚类步骤是很重要的,由于特征类型和特征标度的多样性,距离度量必须谨慎,它经常依赖于应用,例如,通常通过定义在特征空间的距离度量来评估不同对象的相异性,很多距离度都应用在一些不同的领域,一个简单的距离度量,如Euclidean距离,经常被用作反映不同数据间的相异性,一些有关相似性的度量,例如PMC和SMC,能够被用来特征化不同数据的概念相似性,在图像聚类上,子图图像的误差更正能够被用来衡量两个图形的相似性。
将数据对象分到不同的类中是一个很重要的步骤,数据基于不同的方法被分到不同的类中,划分方法和层次方法是聚类分析的两个主要方法,划分方法一般从初始划分和最优化一个聚类标准开始。Crisp Clustering,它的每一个数据都属于单独的类;Fuzzy Clustering,它的每个数据可能在任何一个类中,Crisp Clustering和Fuzzy Clusterin是划分方法的两个主要技术,划分方法聚类是基于某个标准产生一个嵌套的划分系列,它可以度量不同类之间的相似性或一个类的可分离性用来合并和分裂类,其他的聚类方法还包括基于密度的聚类,基于模型的聚类,基于网格的聚类。
评估聚类结果的质量是另一个重要的阶段,聚类是一个无管理的程序,也没有客观的标准来评价聚类结果,它是通过一个类有效索引来评价,一般来说,几何性质,包括类间的分离和类内部的耦合,一般都用来评价聚类结果的质量,类有效索引在决定类的数目时经常扮演了一个重要角色,类有效索引的最佳值被期望从真实的类数目中获取,一个通常的决定类数目的方法是选择一个特定的类有效索引的最佳值,这个索引能否真实的得出类的数目是判断该索引是否有效的标准,很多已经存在的标准对于相互分离的类数据集合都能得出很好的结果,但是对于复杂的数据集,却通常行不通,例如,对于交叠类的集合。
R是开源代码的软件,支撑的用户特别多。
SPSS要收费,而且菜单,窗口式的操作方式让人不知道使用原理与适用范围。
如果你买正版,又觉得良好的用户界面,那你就用SPSS。如果支持知识产权,就用R呗。
根据我的使用经验,我认为一般性的科研可以使用numpy工具链做为主力。
首先,在写矩阵计算相关的语句时,numpy的语法几乎能逼近MATLAB的简洁程度,而其他语言相对来说稍微“难看、难写”一些。
其次,当程序不仅仅涉及到科学计算时,用Python就可以大发神威了。比如我自己遇到的一个实际问题:需要对点云进行一些非常复杂的优化操作,之后需要画出三维图且支持一些拉近拉远转视角的操作,并且还要做出一个不错的界面方便调整参数、载入数据等等。看到画三维点云的第一反应就是用OpenGL,但是使用C/C++写那些非常繁杂的数值优化...用MATLAB可以很舒服、很便捷地写出优化部分的代码,但是直接画大规模的三维点云的速度,以及它那令人忧伤的GUI...
那Python就行吗?是的。在数值计算方面,Numpy/Scipy,以及强大的机器学习包scikit.learn,让这个过程十分惬意。在画三维点云方面,PyOpengl包完全就是OpenGL的Python封装,速度非常快,而且语法几乎同OpenGL一样。最后,使用PyQt写出基于Qt的GUI,这至少是一个标准的完备的GUI包,外观功能都不错。最后的最后,这个程序不需改动就可以跨平台运行,只要Linux/Windows用户按照标准过程安装了相应的包就可以使用,不用折腾本地编译之类的事情。
还有一个问题是速度。Windows下使用python(x,y)、Linux下源里默认安装方法的Python链接的都是较慢的Blas/Lapack库,而MATLAB默认链接MKL,所以矩阵计算速度会慢非常多。但是至少在Linux下是很容易让Numpy链接上MKL的,这样的Numpy计算速度与MATLAB几乎相同,所以速度不是严重的问题。也许C++能在循环上秒杀Python,但是如果你涉及到矩阵计算,用的普通的BLAS/LAPACK库,那么在核心的某几步上会慢成渣,从而在总的速度上被Python超越,得不偿失。当然你也可以让C++程序链接上MKL库,但要移植到别的平台又是一番折腾。
最后就是开发环境,个人推荐Eclipse的Pydev,用起来几乎同MATLAB一样,尤其是调试和看变量值方面。
在统计问题方面,用R写起来最舒服,因为包全,这一点Python或者C比不上。而且R也能链接MKL大大加快速度。还有就是,如果你要写统计方面的论文,那论文里的代码用R似乎会“显得”你更“
专业”一些。
上学期有流形学习课,我用scikit.learn包,几乎每次只改一句话就能提交作业(把LLE变成ISOMAP什么的)。还有一门统计学习课,让我深刻感觉到R就是用来写老师布置的ESL后面的那些编程题的,因为那些方法的作者,以及这本书的作者,写的就是R的包。至于大规模计算、实际的大型工程问题,我没有经验,所以不能提供更多信息了。
补充:如果觉得自己链接MKL库编译Numpy和R麻烦的话,Python可以使用Canopy(就是之前的EPD),R可以使用Revolution R,都是一些商业公司帮配置好的完整发行版,链接了MKL库并支持其他一些特性(例如自带IDE等)。前者各平台都有,后者仅限Windows平台。