把数据划分为聚类
聚类分析是一种用于数据分类的无监督学习技术. 数据元素被划分为称为簇(clusters)的组,它们代表了基于距离或者相异函数的邻近元素组成的集合. 相同元素组成的对的距离或相异度为零,而其它所有元素对的距离或者相异度都为正值.
一般聚类函数.
FindClusters 的数据变量可以是数据元素或者对元素和标签进行索引的规则列表.
| {e1,e2,...} | 指定为数据元素 的列表的数据 |
| {e1→v1,e2→v2,...} | 指定作为数据元素 和标签 之间的规则列表的数据 |
| {e1,e2,...}→{v1,v2,...} | 指定为数据元素 到标签 的映射规则的数据 |
在 FindClusters 中指定数据的方式.
数据元素
可以是数值列表、矩阵、张量、True 和 False 元素组成的列表或者字符串列表. 所有数据元素
必须具有相同的维度.
| Out[2]= |  |
基于规则的数据语法允许对数据元素进行聚类划分,并且返回这些元素的标签.
以下对二维点进行聚类分析,并且把数据列表中的位置作为标签进行标记.
| Out[3]= |  |
基于规则的数据语法也可以用来对数据基于每个数据的某些组成部分进行聚类分析. 例如,用户可能想要在数据表中对数据进行聚类分析,但是忽略表中某些特定的列.
这里对数据分类,而忽略了每个输入数据的前两个元素.
| Out[5]= |  |
原则上,有可能在给定任意维度数的情况下,对点进行聚类分析. 然而,很难想象在二维或三维以上的空间中的聚类. 为了比较本文档中的可选方法,方便进行可视化的二维数据将被采用.
下面的命令定义了300个二维数据点的集合,并且分为4个含糊的簇.
| Out[8]= |  |
在默认设置下,FindClusters 已经形成由点组成的4个簇.
用户也可以命令 FindClusters 寻找指定数目的簇.
| Out[9]= |  |
| Out[10]= |  |
FindClusters 的选项.
随机性用于两种不同方式的聚类分析. 某些方法把几个点随机指定为特定数目的簇,以此作为初始点. 随机性也可能用于帮助决定采用的最佳的簇的数目. 通过使用 FindClusters[{e1, e2, ...}, Method->{Automatic, "RandomSeed"->s}] 产生的随机性的随机种子可以改变以在某些情况下产生不同的结果.
原则上,聚类技术可以用于任何数据集合. 所有这一切需要的是测量集合中的每个元素与其它元素的距离,即一个给出元素间距离的函数.
FindClusters[{e1, e2, ...}, DistanceFunction->f] 把元素对作为较不相似来处理,当它们之间的距离
较大时. 函数 f 可以是任意适当的距离或者相异函数. 相异函数
满足如下条件:
如果
是数字向量,默认情况下 FindClusters 使用平方欧式距离. 如果
是布尔值 True 和 False (或者 0 和1)元素组成的列表,默认情况下 FindClusters 采用基于不相似元素的规范化的分式而得到的相异度度量. 如果
是字符串,默认情况下 FindClusters 采用基于从一个字符串变为另一个所需的点的改变数目而得到的距离函数.
数值数据的距离函数.
这里显示使用曼哈顿距离在
datapairs 中找到的聚类.
| Out[11]= |  |
布尔向量之间的相异度通常由成对比较布尔向量
和
的元素计算得出. 关于
总结每个相异函数是很方便的,其中
是在
和
中的相应元素对的数目,并且分别等于
和
. 数值
计算
中的
对,其中
和
或者是 0 或者是 1. 如果布尔值是 True 和 False,True 相当于1,而 False 相当于 0.
布尔数据的相异函数.
| Out[13]= |  |
字符串数据的相异函数.
编辑距离通过计算当保持字符顺序、并把一个字符串转换为另一个字符串的同时,所要进行的删除、插入和替换的次数. 相比之下,Damerau-Levenshtein 距离计算删除、插入、替换和换位的次数,而海明距离只计算替换的次数.
| Out[15]= |  |
Method 选项可以用来指定聚类所用的不同方法.
| "Agglomerate" | 层次化地寻找分类 |
| "Optimize" | 用局部优化寻找分类 |
Method 选项的明确设置.
方法
和
决定如何对簇的给定数目 k 对数据进行分类.
使用凝聚层次的方法,以簇中的集合成员开始,融合最近的簇,直到剩余 k 个簇.
开始通过建立 k 个代表对象的集合,并且围绕这些对象进行分类,不断迭代直到找到一个(局部)最优分类. 默认的
方法基于对中心点周围进行划分.
其它的 Method 子选项允许在分类上进行更多控制. 可用的子选项取决于选择的 Method.
| "SignificanceTest" | 测试以确定最佳的簇数 |
所有方法的子选项.
对于给定的数据集合和距离函数,最佳簇数 k 的选择可能不清晰. 在 Method->{methodname, "SignificanceTest"->"stest"} 的情况下,
用于决定统计上显著的分类,以帮助选择一个合适的簇数.
的可能值为
和
.
检测使用 silhouette 统计量来测试数据分类的优良程度.
检测使用 gap 统计量来决定数据分类的优良程度.
测试把数据细分为先后更多的簇,以查看 silhouette 统计量的第一个最小值.
检测比较从数据产生的簇和从零假设集合的样本产生的簇的分散度. 零假设集合是在输入数据的主成分定义的框架中呈均匀分布的数据.
方法具有两个子选项:
和
. 子选项
设置零假设集合的数目,用于与输入数据进行比较. 选项
设置灵敏度. 通常情况下,具有较大值的
将有利于减少选中的簇数. 默认设置为
和
.
以下显示了使用

测试的对
datapairs 分类的结果.
| Out[16]= |  |
这是使用

测试而找到的分类,容差参数被设置为 3. 较大的值选择较少的簇数.
| Out[17]= |  |
注意到在这两个例子中找到的分类是相同的. 唯一的不同是如何选择簇数的方法.
方法的子选项.
在 Method->{"Agglomerate", "Linkage"->f} 的情况下,指定的链接函数 f 用于凝聚聚类.
| "Single" | 最小簇内相异度 |
| "Average" | 平均簇内相异度 |
| "Complete" | 最大簇内相异度 |
| "WeightedAverage" | 加权平均簇内相异度 |
| "Centroid" | 与簇中心的距离 |
| "Median" | 与簇中位数的距离 |
| "Ward" | Ward 最小方差相异度 |
| f | 纯函数 |
子选项的可能值.
链接方式决定了簇内的相异度,或者在聚变一级,鉴于各个成员元素之间的相异度.
在 Linkage->f 的情况下,f 是定义链接算法的纯函数. 簇之间的距离或者相异度由未合并的簇之间的距离或者相异度的信息来递归决定,并以此产生和新合并成的簇之间的距离和相异度信息. 函数 f 定义从簇 k 到由簇 i 和 j 融合形成的新簇之间的距离. 给 f 提供的自变量为
、
、
、
、
和
,其中 d 是簇之间的距离,而 n 是一个簇中的元素数目.
| Out[18]= |  |
方法的子选项.
以下是

方法的单次迭代决定的分类.
| Out[19]= |  |