社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  机器学习算法

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

机器学习初学者 • 3 年前 • 299 次点击  

什么是聚类?

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

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

  • 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()
往期精彩回顾




Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/133326
 
299 次点击