聚类算法之Kmeans聚类详解

聚类算法是无监督学习算法,它根据样本之间的相似性,将样本划分到不同的类别中;不同的相似度计算方法,会得到不同的聚类结果,常用的相似度计算方法有欧氏距离法。聚类算法的目的是在没有先验知识的情况下,自动发现数据集中的内在结构和模式。

聚类算法的分类:

  • 按照聚类细粒度分类:细聚类和粗聚类

  • 聚类算法之Kmeans聚类详解_第1张图片

  • 根据实现方法分类:

    • K-means:按照质心分类,主要介绍K-means,通用、普遍

    • 层次聚类:对数据进行逐层划分,直到达到聚类的类别个数

    • DBSCAN聚类:基于密度的聚类算法

    • 谱聚类:基于图论的聚类算法

KMeans基本思路

通过计算相似度(默认欧氏距离),将相似度大的样本聚集到同一个类别,K表示聚成K个类别,means表示每个类别的聚类中心点是通过簇中所有样本点的均值得到。

KMeans算法流程:

  • 事先确定常数K,K是最终的聚类类别数

  • 随机选择K个样本点作为初始的聚类中心

  • 计算每个样本点到K个中心点的距离,选择最近的聚类中心点作为标记类别

  • 根据分好的类别,计算每个类别的新的聚类中心点(每个点的坐标的平均值),如果得到了新的聚类中心点则停止聚类,否则继续执行第3步,直到聚类中心点不再变化

 聚类算法之Kmeans聚类详解_第2张图片

评估方法:

  • 误差平方和SSE,值越小,表示数据点越接近它们的中心点,聚类效果越好

  • 聚类算法之Kmeans聚类详解_第3张图片

  • “肘”方法(Elbow method),通过SSE确定n_clusters的值(K值)

    • 对于n个点的数据集,迭代计算 k from 1 to n,每次聚类完成后计算 SSE

    • 随着类别的增加,SSE 是会逐渐变小的,因为每个点都是它所在的簇中心本身

    • SSE 变化过程中会出现一个拐点,下降率突然变缓时即认为是最佳 n_clusters 值

    • 在决定什么时候停止训练时,肘方法同样有效,数据通常存在噪音,在增加分类无法带来更多回报时,则停止增加类别

  • 轮廓系数法SC(Silhouette Coefficient),考虑簇内的内聚程度簇外的分离程度

    • 对每个样本点计算到簇内其它所有样本的平均距离a,值越小,说明簇内聚程度越高

    • 对每个样本点计算到其它簇所有样本的平均距离b,值越大,说明该样本离其它簇越远

    • 计算公式:S = (b - a) / max(a, b),取值范围为【-1,1】,值越大越好

    • 计算所有样本的平均轮廓系数

    • 聚类算法之Kmeans聚类详解_第4张图片

 

from sklearn.datasets import make_blobs  # 加载数据集
from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_score # sc系数 对聚类进行评估
import matplotlib.pyplot as plt
import pandas as pd

customer = pd.read_csv('customers.csv')
customer.describe()  # 做聚类的时候,需要注意特征的取值大小(量纲) 取值差异大需要做归一化/标准化
x = customer.iloc[:,[3,4]]  # 选取第3列和第4列
sse_list = []
sc_score = []
# 先找到最佳的K取值
for k in range(2,11):
    my_kmeans = KMeans(n_clusters=k)
    y_pred = my_kmeans.fit_predict(x)
    sse_list.append(my_kmeans.inertia_)  # kmeans.inertia_ 这个属性表示sse值
    sc_score.append(silhouette_score(x,y_pred))
plt.plot(range(2,11),sse_list)
plt.grid()
plt.title('sse')
plt.show()
plt.plot(range(2,11),sc_score)
plt.grid()
plt.title('sc_score')
plt.show()
# 从以上绘图中,找到sse的拐点和sc_score的最高点,图像显示为n_clusters=5时候最好
kmeans = KMeans(n_clusters=5)
y_pred= kmeans.fit_predict(X)
customer['cluster'] = y_pred  # 将聚类结果加到数据表中

 

你可能感兴趣的:(机器学习,聚类,kmeans,python,肘方法,轮廓系数法)