理解聚类:
本质:
1. K-Means做聚类
理解k-Means过程
例:对下图做聚类
先随机生成k个中心点,如下图,k=3
然后给定一个初始化分
计算每个cluster的x,y的均值,使得每个cluster都产生一个均值中心点。
然后根据距离调整划分情况,如下图,上图中的三角形离中心五角星更近,所以把它划分成五角星,
新加入一个五角星后,中心自然会再次向新加入的方向移动一点,中心移动后,可能又会加入新的,因为可能又会有三角形离五角星的中心比三角形的中心更近,如下图,又有两个
新的两个三角形加入后,中心又会调整…一直迭代,直至中心点不再变化或者没有新的点加入,
上述例子的流程就是K-Means
流程
上图中的第二个公式我们也可以看的出来,求加和再除以个数,就是求中心点的;第一个公式是算点与每个中心点的最小距离,所以它是用来分类的。
缺点
K-Means开始会随机生成k个中心点,完一随机生成的中心点距离特别近
2. 其他做聚类的方法
例:第一步:随机第一个中心点k,
第二步:算每个样本到k的距离,假设又A,B,C三个样本到k的距离分别为5,4,1;把距离算出概率,把概率作为坐标轴,则0~50是A的50%的概率,50~90是B的40%,90~100是C的10%
第三步:随机一个0~100的数,如果这个数在0~50之间,则选A作为另一个中心点,如果在50~90之间,则中心点为B,如果在90~100之间,则中心点为C
解决了k-means的k个中心点随机情况,k-means++使得初始的k个中心点分布均匀些
3. 选择适当的聚类数 k
上图中的横坐标是k,纵坐标是Error
Error=每一个类的MSE加和,每一个类的MSE=每个样本和中心点的距离平方加和
如上图箭头所指的地方,也就是拐点处就是我们要的k最适当的地方。
原因:
距离A=上一次的Error(纵坐标) - 这一次的Error(纵坐标)
距离B= 这一次的 - 下一次的,
而拐点处就是距离A-距离B最大的地方
说白了,就是找到一个点,这个点之后不管k怎么增加,对Error的影响都不是那么明显
4. 代码实现
# -*- coding:utf-8 -*-
import numpy as np
import matplotlib.pyplot as plt
import sklearn.datasets as ds
import matplotlib.colors
from matplotlib import font_manager
from sklearn.cluster import KMeans
from sklearn.cluster import MiniBatchKMeans
def expand(a, b):
d = (b - a) * 0.1
return a-d, b+d
if __name__ == "__main__":
N = 400
centers = 4
# 创建聚类的模拟数据400条,两个特征,4个k,有y的原因是对比我们评估的效果
data, y = ds.make_blobs(N, n_features=2, centers=centers, random_state=2)
# 与上面不同的是方差,方差越大,数据点越分散,方差越小,数据越密集,四个类的数据密集程度不一样
data2, y2 = ds.make_blobs(N, n_features=2, centers=centers, cluster_std=(1, 2.5, 0.5, 2), random_state=2)
# 也是生成四个类别的数据,第一个类别取data第一个类别的全部,第二个类别取data第二个类别前50条数据,第三个类别取data第三个类别前20条,第四个类别取data第四个类别前5条
data3 = np.vstack((data[y == 0][:], data[y == 1][