【机器学习】小白学聚类:聚类基础与聚类个数选择

什么是聚类?

聚类是一组用于将数据划分为组或簇的技术。同组的数据中相比其他组的数据更加相似,而在聚类的过程选择合适的聚类算法是关键。

现阶段常见的聚类算法包括:

  • Partitional clustering

  • Hierarchical clustering

  • Density-based clustering

Partitional clustering

Partitional clustering将数据对象划分为不重叠的组,并且每个集群必须至少有一个对象。Partitional clustering两个示例是-means和-medoids。

Partitional clustering是非确定性的,这意味着即使运行基于相同的输入,它们也可以从两个单独的运行中产生不同的结果。

Hierarchical clustering

Hierarchical clustering通过建立层次结构来确定聚类分配。这是通过自下而上或自上而下的方法实现的:它合并最相似的两个点,直到所有点都合并到一个集群中。

Hierarchical clustering是一个确定性过程,运行多次但最终聚类结果不会改变。

Density-based clustering

Density-based clustering根据区域中数据点的密度确定聚类分配,簇被分配在由低密度区域分隔的高密度数据点的区域。

Density-based clustering与其他聚类类别不同,这种方法不需要用户指定聚类的数量。

-Means聚类

均值聚方法第一步是随机选择个质心,其中等于您选择的聚类数,质心是表示集群中心的数据点。

468c44199f1a54963c5aa2c0f36e4c72.gif

均值聚方法期望步骤将每个数据点分配到其最近的质心。均值聚方法最大化步骤计算每个集群的所有点的平均值并设置新的质心。

聚类优劣是通过计算质心收敛后的平方误差 (SSE) 之和来确定的,或者与前一次迭代的分配相匹配。SSE 定义为每个点到其最近质心的欧几里得距离平方和。

import matplotlib.pyplot as plt
from kneed import KneeLocator
from sklearn.datasets import make_blobs
from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_score
from sklearn.preprocessing import StandardScaler

features, true_labels = make_blobs(
    n_samples=200,
    centers=3,
    cluster_std=2.75,
    random_state=42
)

make_blobs()生成合成数据集:

  • n_samples是要生成的样本总数

  • centers是要生成的中心数

  • cluster_std是标准差

均值聚方法中使用的参数:

  • init控制初始化技术。

  • n_clusters为聚类个数

  • n_init设置要执行的初始化次数

  • max_iter为初始化最大迭代次数

kmeans = KMeans(
    init="random",
    n_clusters=3,
    n_init=10,
    max_iter=300,
    random_state=42
)

kmeans.fit(scaled_features)

# The lowest SSE value
kmeans.inertia_


# Final locations of the centroid
kmeans.cluster_centers_

选择合适的聚类个数

肘部法(elbow method)

要执行肘法,运行几个k均值,每次迭代递增k,并记录SSE:

kmeans_kwargs = {
    "init": "random",
    "n_init": 10,
    "max_iter": 300,
    "random_state": 42,
}

# A list holds the SSE values for each k
sse = []
for k in range(1, 11):
    kmeans = KMeans(n_clusters=k, **kmeans_kwargs)
    kmeans.fit(scaled_features)
    sse.append(kmeans.inertia_)

SSE曲线开始弯曲的最佳点是肘点。该点的3被认为是误差和聚类数量之间的合理权衡。

f5c5835fd2a3fb90b909d4ffed72566e.png

plt.style.use("fivethirtyeight")
plt.plot(range(1, 11), sse)
plt.xticks(range(1, 11))
plt.xlabel("Number of Clusters")
plt.ylabel("SSE")
plt.show()

轮廓系数(silhouette coefficient)

轮廓系数是独立簇同类的凝聚力和分离度,它根据两个因素量化数据点与其分配的集群的匹配程度:

  • 数据点与同簇中其他点的接近程度

  • 数据点与其他同簇中的点之间的距离

# A list holds the silhouette coefficients for each k
silhouette_coefficients = []

# Notice you start at 2 clusters for silhouette coefficient
for k in range(2, 11):
    kmeans = KMeans(n_clusters=k, **kmeans_kwargs)
    kmeans.fit(scaled_features)
    score = silhouette_score(scaled_features, kmeans.labels_)
    silhouette_coefficients.append(score)

绘制每个的平均轮廓分数k表明,最好的选择3因为它具有最高分数:

28a469b6269b84860e7c462eda70852d.png

plt.style.use("fivethirtyeight")
plt.plot(range(2, 11), silhouette_coefficients)
plt.xticks(range(2, 11))
plt.xlabel("Number of Clusters")
plt.ylabel("Silhouette Coefficient")
plt.show()
 
 
 
 
 
 
 
 
 
 
往期精彩回顾




适合初学者入门人工智能的路线及资料下载(图文+视频)机器学习入门系列下载中国大学慕课《机器学习》(黄海广主讲)机器学习及深度学习笔记等资料打印《统计学习方法》的代码复现专辑
AI基础下载机器学习交流qq群955171419,加入微信群请扫码:

c4c73dfc551fcb144652f892661fcf9a.png

  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值