关于聚类的含义,以及我们熟知的k均值算法、基于层次、基于密度,我们之前都已经学习过了,所以不多谈,这里关于在scikit-learn中是如何使用的。
一:代码直接开整
首先,我们先自己制作二维数据,用画出来。
froms klearn.datasetsimportmake _ blobsimportmatplotlib.pyplotasplt #自己创建数据集,#自己创建一个000个样本的数据。 每个数据是两个特征,总共四个中心x,y=make。n _ features=2,centers=4,random_state=54 ) print(x.shape ) print ) y.shaphap ax1=PLT.subplots(1) #生成的子图的数量,第一个是画布,第二个是对象ax1.scatter ) x [ :0 ],x [ 3360,1 ],marker='o 只是,这正是我们在集群里偶然在做的事情啊。 # color=['red ',' black ',' green ',' blue']# fig,ax1=PLT.subplots(1)生成的子图的数量,第一个是画布,第二个是对象#点形状# s=8,#使用点尺寸# c=color[i] ) #设定点颜色# # PLT.title (originalclassification ) )
第二步,建立k均值模型并拟合,结果如图所示
#开始群集时的froms klearn.clusterimportkmeansn _ clusters=4cluster=k means (n _ clusters=n _ clusters, random_state=9) cluster=cluster.fit(x ) #培训pred=cluster.labels _ print (pred [ 0:8 ] ) )对应于每个样本的结果print ) )通过cllint获得的若干重心print(cluster.inertia_ )的总距离)的平方和为, 不是合适的模型评估指标的y_pred=cluster.fit_predict(x ) x ) print ) y_pred[ color=['red ',' black ',' green ',' bren ] 第一个是画布,第二个是对象for i in range(4 ),x[y_pred==i,1],#布尔索引marker='o ',#点形状s=8, #使用点大小c=color[i]设置点颜色#将重心单独绘制在ax1.scatter(cluster )上的cluster.cluster _ centers _ [ :1 ],# blib
二:评估指标
1 )虽然我们使用轮廓因子进行了测量,但是好的聚类算法的表现是,聚类内的近似接近,聚类外的差异越远越好。
样本与自身所在集群中其他样本的相似度a :等于样本与同一集群中所有其他点的平均距离。
样本与其他集群中样本的相似度b :等于样本与其最近的其他集群中所有点的平均距离。
因此,轮廓系数如下:
这个公式可以理解为如下
显然,该值介于[-1,1 ]之间,a越小越好,且b越大越好。 因此,s值越接近1越好,越接近-1越不好。
为了声明,将为每个样本计算轮廓系数。 也就是说,每个样本都有轮廓系数。 一个簇的许多采样的轮廓因子越高,平均值就越高,模型聚类就越好。
用代码试试吧
#衡量模型好坏的指标from sklear
n.metrics import silhouette_scorefrom sklearn.metrics import silhouette_samples# 经过上面的计算,我们有了原始特征矩阵数据x,y,以及我们预测的y_predprint(silhouette_score(x, y_pred)) # 计算轮廓系数,第一个是特征矩阵(样本坐标),第二个是聚类的结果print(silhouette_score(x, cluster.labels_)) # 计算轮廓系数silhouette_results = silhouette_samples(x, y_pred)print(silhouette_results.shape) # 展示每个样本的轮廓系数print(silhouette_results.mean()) # 展示每个样本的轮廓系数综合后的平均值,就是silhouette_score的值。2:Calinski-Harabaz指数
因此我们希望其值越大越好啊。其效果也快,比轮廓系数计算快。
from sklearn.metrics import calinski_harabasz_scoreprint(calinski_harabasz_score(x, y_pred))print(calinski_harabasz_score(x, cluster.labels_))这里为什么要学习衡量指标呢,就是为了调整超参数使用的。
三:一些重要的参数
KMeans的第一步就是初始化质心,随机放置的效果也会不一样,最后会直接影响效果的,也会影响模型运行时间。
新的方法可以使KMeans++,他们开发出一个算法,使得初始化质心彼此远离,从而得到更加可靠的。我们的参数init,可以输入random,kmeans++,或一个n维数组(用户自行决定质心,维度是n_cluster X n_features),一般我们保持默认kmeans++不动即可。
random_state就是质心随机初始化的种子,指定了的话,控制每次初始化质心都在相同的位置。
如果不指定随机数种子,就按按照n_init来使用多个随机种子来运行多次,选择最好的。这个参数就是n_init,默认是10,我们可以增加这个次数,次数越大,KMeans运行时间越长。
如何让迭代停止呢?
max_iter:可以让迭代提前终止,最大的迭代次数。
tol:如过两次迭代之间Inertial下降的量小于该值就结束掉迭代,基本已经不会有大变化了。它是浮点数,默认是1e-4。
四:聚类用于压缩,矢量量化。
KMeans的一个应用就是将非结构化数据(图像声音等)进行矢量量化,非结构化数据往往占用比较大的存储空间,数据量大,运算缓慢,我们希望在保证数据质量的情况下,尽可能减少数据的大小,简化结构化数据的结构。
降维自带压缩属性。
我们之前学习过的特征选择,是选择出有价值的贡献最大的特征。
之前学习的PCA,是聚合特征信息,从而创造出更低维度价值更高的特征。
矢量量化就是在同等样本量上压缩信息的大小,不改变样本数目,也不改变特征数目。
举个例子,我们有40个样本有40个不同的样本信息,假如我们把他们进行效果很好的聚类,后面发现,他们属于4个簇,我们就用每个簇的质心俩替换/代表/表示该簇内所有样本信息,这样话,我们只需要四组信息就表示了40个样本的信息,我们只需要保存这个四个质心的信息,有点四舍五入的感觉哈。
这样一来,信息量会被压缩到很小,但是损失的信息又不大。
我们举个例子,压缩一个图像,比如我们选取RGB图像,压缩到64个质心。用64个质心来替换每个像素。
原始图如下:
经过kmeans压缩后的