从这一章开始,我们讨论无监督学习
,即数据中不含有目标值,只有特征值。也正因为没有目标值,无监督学习
做的也不是预测这件事情,而是聚类和降维等。
关于降维,我们在第三章讨论的PCA
,实际上就属于无监督学习
的降维。
这里,我们主要讨论聚类
。
在聚类算法中根据样本之间的相似性,将样本划分到不同的类别中,对于不同的相似度计算方法,会得到不同的聚类结果。
我们从最典型的聚类算法,k-means
开始。
简介
k-means,由两部分组成,k
和means
。
- k:把数据划分成k个类别
- 也是初始质心(中心点)个数,也是计划聚类数
- means:质心到其他数据点距离的平均值
- means就是mean的复数,就是平均值的复数。一共有k个平均值
过程
上面过程的解释:
假设k等于3
- 存在若干个点
- 现在随机选取三个质心
- 计算其余点到三个质心的距离,以最近的值作为分类
- 计算新的质心,移动质心
- 计算其余点到三个质心的距离,以最近的值作为分类。以此更新分类
- 重复操作,直到所有质心的位置不再改动。
(有时候我们也设置最大的迭代次数。)
我们再以具体的数字为例。
假设存在数据如下
P1 | P2 | P3 | P4 | P5 | P6 | P7 | P8 | P9 | P10 | P11 | P12 | P13 | P14 | P15 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
X | 7 | 2 | 6 | 1 | 1 | 3 | 8 | 9 | 10 | 5 | 7 | 9 | 2 | 5 | 5 |
Y | 7 | 3 | 8 | 4 | 2 | 1 | 2 | 10 | 7 | 5 | 6 | 3 | 8 | 11 | 2 |
我们选择P1和P2作为初始的质心。则有
然后将所有P1大类
的x都求平均,y求平均。P2大类
操作相同。由此得到新的P'1
和P'2
,这就是新的质心。
再进行一轮迭代更新。
如此循环,直到质心不再变化,或到达最大迭代次数。
我们联系一下遗传算法的过程
其实思路比较相近。都是迭代计算,上一步的结算结果,作为这一步的输入。
评估
k-means的评估方法有
- SSE
- 轮廓系数
- CH系数
SSE
SSE:Sum of Squear due to Error 误差平方和
如图
其中
- 为分类数,在图中是,。分类数是2
- 每一个蓝色点代表p
- m为每一个类的质心
轮廓系数
轮廓系数结合了凝聚度(Cohesion)和分离度(Separation)。
其中
- 代表凝聚度
- 代表分离度
我们以图6中,蓝点最下方的一个为例。
- 计算该蓝点到其他蓝点的距离的平均值,记作,这就是
凝聚度
。 - 计算该蓝点分别到红色点和白色点的距离的平均值,此时我们会有两个平均值,取其中最小的值,记做,这就是
分离度
。 - 套入公式,计算的轮廓系数。
根据公式,我们也很容易知道
- 当,轮廓系数趋于1,聚类效果好
- 当,轮廓系数等于0。
- 当,轮廓系数趋于-1,聚类效果差
- 轮廓系数的值
的含义是
远远大于
CH系数
CH:Calinski-Harabasz Index
类别内部数据的距离平方和越小越好,类别之间的距离平方和越大越好,这样的CH值越大,聚类效果越好。
高类聚低耦合
其中
- 为样本数
- 为聚类数
- 乘以的原因是,想用
尽量少的类别
聚类尽量多的样本
。
SSB,不同类别之间的距离
其中
- 其中是每一个类别的质心
- 是所有类别质心的质心
- 是每一个类别样本的数量
SSW,同一类别不同点之间的距离
其中
- m是点的个数
- 是每一个点
- 是每一个类别的质心
实现
我们以对A股进行聚类为例
算法的实现
1 | from sklearn.cluster import KMeans |
- clusters:开始的聚类中心数量
- max_iter:最大迭代次数
- init,初始化方法,默认是
k-means++
评估方法的实现
1 | # 轮廓系数 |
示例代码:
1 | # 轮廓系数 |
运行结果:
1 | 数据的行数和列数 |
优缺点
- 优点:迭代算法,直观简单,且实用
- 缺点:
- 容易受异常点的影响。
- 在大规模数据集上,收敛太慢。
- 容易收敛到局部最优解。
进阶
Canopy
在一般的业务场景下,k值是已知的。但是也有k值不确定的情况,这时候我们需要自己来判断k值。
这就需要Canopy算法
。
Canopy的过程
上面过程的解释
- 存在若干个点
- 随机选取一个点,标为黄色。
- 以T1为半径作圆,圆内的点就认为同属于一个类别,标为黄色。
- 以T2为半径作圆,认为T1和T2之间的点是疑似,标为黑色。
- 在T2圆外,随机选取一个点,标为绿色
- 以T1为半径作圆,圆内的点就认为同属于一个类别,标为绿色。这时候上一步被标为黑色的点,这一步被标为了绿色,即不再是疑似。
- 以T2为半径作圆,认为T1和T2之间的点是疑似,标为黑色。
- 再从两个T2圆外选择一个点,如此迭代操作
最后会的到一个类别的数量,认为这个就是k值
Canopy的优缺点
- 优点
- Canopy还可以用来去除一些噪声
- 缺点
- T1、T2的选择问题
- 实际上也是绝大部分的问题,不能作为Canopy的比较缺点
- T1、T2的选择问题
k-means++
k-means++的思想:离当前已有聚类中心较远的点有更大的概率被选为下一个聚类中心。通过这种方法尽量分散选质心。
每个样本被选为下一个聚类中心的概率
其中
- 是欧式距离的函数
举例如下:
存在八个点,如上面的图所示。
现在我们选取6
这个点作为第一个初始聚类中心。
则有
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | |
---|---|---|---|---|---|---|---|---|
1 | 0 | 1 | ||||||
8 | 13 | 5 | 19 | 1 | 0 | 2 | 1 |
则,1
这个点,作为下一个聚类中心的概率是
其他的点计算类似。
k-medoids
K-medoids
和k-means
的主要区别在于质心的选取。
- 质心的资质
k-means
中的质心,可以不是样本中的点。k-medoids
中的质心,必须是样本中的点。
- 质心的生成规则
k-means
中,将质心取为当前类别中所有数据点的平均值,这也导致其对异常点很敏感。k-medoids
中,将从当前类别中
选取到当前类别的其他点
的距离之和最小的点作为质心。
特别注意:K-medoids使用SAD来计算两点间的距离。
SAD:Sum of Absolute Differences,绝对差值和。其实也就是曼哈顿距离
。
在n维空间中,计算SAD的公式如下所示:
除了上述不同,整体过程和k-means
非常相似,这里不在赘述。
k-medoids
的优缺点
- 优点
- 抗噪声能力强
- 小规模数据性能更好。
- 缺点
- 速度太慢(尤其是生成下一个质心的规则)
- 其实少数噪声对
k-means
影响有限,这也是为什么k-means
比k-medoids
更普遍的原因。
但是k-medoids
和k-means
都会陷入局部最优解的困境。