Python-深度学习-学习笔记(18):Kmeans聚类算法与elbow method

Python-深度学习-学习笔记(18):Kmeans聚类算法与elbow method

一、Kmeans聚类算法

对于"监督学习"(supervised learning),其训练样本是带有标记信息的,并且监督学习的目的是:对带有标记的数据集进行模型学习,从而便于对新的样本进行分类。而在“无监督学习”(unsupervised learning)中,训练样本的标记信息是未知的,目标是通过对无标记训练样本的学习来揭示数据的内在性质及规律,为进一步的数据分析提供基础。对于无监督学习,应用最广的便是"聚类"(clustering)。

1.聚类

俗话说“物以类聚”,其实从广义上说,聚类就是将数据集中在某些方面相似的数据成员放在一起。一个聚类就是一些数据实例的集合,其中处于相同聚类中的数据元素彼此相似,但是处于不同聚类中的元素彼此不同。
由于在聚类中那些表示数据类别的分类或分组信息是没有的,即这些数据是没有标签的,所有聚类及时通常被成为无监督学习(Unsupervised Learning)。

2. Kmeans

k均值聚类算法(k-means clustering algorithm)是一种迭代求解的聚类分析算法,其步骤是随机选取K个对象作为初始的聚类中心,然后计算每个对象与各个种子聚类中心之间的距离,把每个对象分配给距离它最近的聚类中心。

其步骤概括如下:

  1. 簇分配:将数据随机生成K个点(聚类中心),根据数据离这K个点的距离(欧氏距离:在多维度下的距离),进行归类,离某个簇(聚类中心)近的点都归为这一类。
    在这里插入图片描述
  2. 移动聚类中心:将所有归为一类的点计算平均值并将聚类中心移动到这个平均值处,从而更新聚类中心。
  3. 通过不断的计算距离,簇分配,移动聚类中心从而得到新的分类,直到这K个聚类中心不会发生变化为止。
    在这里插入图片描述
    如果某个聚类中心没有对应的点,那么就重新随机初始化这个聚类中心。
3. Kmeans算法步骤

在这里插入图片描述

4. Kmeans代码实现

你只需向kmeans算法代码传入两个参数:1、训练集;2、聚类数量

#coding=utf-8
import numpy as np
from sklearn.cluster import KMeans #调用这个函数包可以直接使用kmeans工具
import matplotlib.pyplot as plt
 
#随机生成一些测试用的点
cluster1=np.random.uniform(0.5,1.5,(2,10))#2行10列
cluster2=np.random.uniform(5.5,6.5,(2,10))
cluster3=np.random.uniform(3.0,4.0,(2,10))
 
#将散点图画出来
X=np.hstack((cluster1,cluster2,cluster3)).T  #在水平方向上平铺
plt.scatter(X[:,0],X[:,1])
plt.xlabel('x1')
plt.ylabel('x2')
plt.show()
 
#测试聚类数量从1到9
K=range(1,10)
for k in K:
    kmeans=KMeans(n_clusters=k)#这里为聚类数量
    kmeans.fit(X)#这里的X为你要聚类的训练集

还可以通过以下方式写

kmeans=KMeans(n_clusters=i).fit(x)#通过一句话实现kmeans

这里是一些你想要的查看的信息

kmeans.labels_#取出分类得出的标签
kmeans.cluster_centers_#取出该数据的分类中心

二、elbow method

我们知道k-means是以最小化样本与质点平方误差作为目标函数,将每个簇的质点与簇内样本点的平方距离误差和称为畸变程度(distortions),那么,对于一个簇,它的畸变程度越低,代表簇内成员越紧密,畸变程度越高,代表簇内结构越松散。 畸变程度会随着类别的增加而降低,但对于有一定区分度的数据,在达到某个临界点时畸变程度会得到极大改善,之后缓慢下降,这个临界点就可以考虑为聚类性能较好的点。其图像像一个胳膊肘,故名为elbow method
elbow method图像的横坐标为你起初设定的簇分类数目(下面例子为2-20),纵坐标为畸变程度也就是某个簇与这一类中所有点的距离的平方和。

代码实现:
具体做法是先用**m[j]取到所有训练集经过Kmeans之后得到的标签,然后用c[m[j]]**得到所有训练集经过Kmeans之后分配到某一类的聚类中心的位置,再求每个点的坐标与其对应的聚类中心的位置的欧氏距离的平方和,即可得到畸变程度。

def zhoubu(x):
    #x代表需要聚类数据的坐标
    import numpy as np
    from sklearn.cluster import KMeans
    import matplotlib.pyplot as plt#导入库
    Sum=np.zeros(18)#Sum用于储存肘部法则判断指标
    for i in range(2,20):
        kmeans=KMeans(n_clusters=i).fit(x)#kmeans算法拟合
        m=kmeans.labels_#取出分类得出的标签
        c=kmeans.cluster_centers_#取出每个分类中心
        for j in range(len(x)):
            c1=c[m[j]]#第j个样本所属类的中心
            x1=x[j]#第j个样本的坐标
            Sum[i-2]=Sum[i-2]+sum((x1-c1)**2)#计算判断指标
    c=plt.plot(np.arange(2,20),Sum )
    plt.xticks(np.arange(2,20))#绘图
    return Sum

三、purity方法

当你根据elbow method方法得到你想要的的聚类数量之后,你可能想要大致判断一下kmeans算法对你的数据集的聚类准确度,那么可以采用purity方法。
在这里插入图片描述
其中Ω = {ω1,ω2, . . . ,ωK}是聚类的集合ωK表示第k个聚类的集合。C = {c1, c2, . . . , cJ}是文档集合,cJ表示第J个文档。N表示文档总数。
也就是从每一个聚类中寻找一个最多的数据种类(认为这个类是由数据量占比最大的数据种类构成),并将所有聚类中的这些数据相加,除以总数。
在这里插入图片描述
如上图,其中第一类正确的有5个(X),第二类正确的有4个(O),第三个3个(◇),而数据量共有17个,那么purity = ( 3+ 4 + 5) / 17 = 0.71。

代码实现:
d2代表预测的类编号等于j的逻辑变量,d1代表真实的类编号等于i的逻辑变量,只有当d1与d2为真时(也就是2者都为真),那么才证明预测正确。换句话说c存储的是一个簇中每种真实标签的个数,m中存储的是这7个簇的所有这些种类。

s=KMeans(7).fit(X_data)
s1=s.labels_
m=np.zeros([7,7])#储存每一类的分类正确个数
c=np.zeros(7)#中间变量,用于储存某一类的分类正确个数
for i in range(7):
    d2=(s1==i)
    for j in range(1,8):
        d1=(Y_data.T==j)
        c[j-1]=np.sum(d1&d2)
    m[i,:]=c
np.sum(np.max(m,axis=1))/21000#计算准确率
发布了55 篇原创文章 · 获赞 76 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/qq_42826337/article/details/96349724
今日推荐