什么是聚类?
聚类是一组用于将数据划分为组或簇的技术。同组的数据中相比其他组的数据更加相似,而在聚类的过程选择合适的聚类算法是关键。
现阶段常见的聚类算法包括:
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聚类
均值聚方法第一步是随机选择个质心,其中等于您选择的聚类数,质心是表示集群中心的数据点。
均值聚方法期望步骤将每个数据点分配到其最近的质心。均值聚方法最大化步骤计算每个集群的所有点的平均值并设置新的质心。
聚类优劣是通过计算质心收敛后的平方误差 (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被认为是误差和聚类数量之间的合理权衡。
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因为它具有最高分数:
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,加入微信群请扫码: