标签:plt 草稿 KMeans kmeans 聚类 PCA data 高维
- 对于容易出现维度灾难的高维向量序列聚类,在不知道聚类数量的情况下,可以使用基于密度的聚类方法dbscan;也可以通过估计聚类数量,再使用kmeans。对于kmeans,一般有以下处理方法:
-
方法一:使用 NearestNeighbors 估计簇数量,然后用 KMeans 聚类
NearestNeighbors
可以通过计算样本的 kkk-近邻距离,利用距离拐点的方法估计最优簇的数量。
- 使用
NearestNeighbors
计算每个样本的第 kkk-近邻距离(通常 k=min_samples+1k = min\_samples + 1k=min_samples+1)。
- 绘制距离曲线,寻找拐点。
使用拐点估计的簇数量初始化KMeans,并进行聚类。
import numpy as np
from sklearn.cluster import KMeans
from sklearn.neighbors import NearestNeighbors
import matplotlib.pyplot as plt
# 示例数据
np.random.seed(42)
data = np.vstack([
np.random.normal(loc=0, scale=0.5, size=(50, 2)),
np.random.normal(loc=3, scale=0.5, size=(50, 2)),
np.random.normal(loc=6, scale=0.5, size=(50, 2))
])
# 使用 NearestNeighbors 计算 k-近邻距离
k = 5 # 通常选择比 min_samples 大 1 的值
neighbors = NearestNeighbors(n_neighbors=k).fit(data)
distances, _ = neighbors.kneighbors(data)
distances = np.sort(distances[:, -1]) # 第 k 近邻的距离
# 绘制距离曲线
plt.plot(distances)
plt.xlabel('Samples sorted by distance')
plt.ylabel(f'{k}th Nearest Neighbor Distance')
plt.title('Elbow for K Estimation')
plt.show()
# 根据拐点估计簇数
estimated_clusters = 3 # 手动通过图中拐点估计簇数量
# 用 KMeans 聚类
kmeans = KMeans(n_clusters=estimated_clusters, random_state=42).fit(data)
# 可视化结果
plt.scatter(data[:, 0], data[:, 1], c=kmeans.labels_, cmap='viridis', s=50)
plt.scatter(kmeans.cluster_centers_[:, 0], kmeans.cluster_centers_[:, 1], c='red', marker='X', s=200)
plt.title('KMeans Clustering')
plt.show()
方法二:使用 PCA 的主成分数量估计簇数,然后用 KMeans 聚类
PCA
可以通过分析数据的主要方差方向估计潜在的簇数,通常观察累积解释方差比,选择主要贡献的主成分数作为簇数的估计值。
- 使用
PCA
对数据降维。
- 绘制累积解释方差比,选择一个拐点估计主要成分的数量。
- 使用估计的成分数作为簇数输入到
KMeans
。
from sklearn.decomposition import PCA
# 使用 PCA 分析主成分
pca = PCA().fit(data)
cumulative_variance_ratio = np.cumsum(pca.explained_variance_ratio_)
# 绘制累积方差解释曲线
plt.plot(range(1, len(cumulative_variance_ratio) + 1), cumulative_variance_ratio, marker='o')
plt.axhline(y=0.9, color='r', linestyle='--', label='90% Variance Threshold')
plt.xlabel('Number of Principal Components')
plt.ylabel('Cumulative Explained Variance Ratio')
plt.title('PCA for Cluster Estimation')
plt.legend()
plt.show()
# 根据拐点选择主成分数量
estimated_clusters_pca = 3 # 通过图估计
# 用 KMeans 聚类
kmeans_pca = KMeans(n_clusters=estimated_clusters_pca, random_state=42).fit(data)
# 可视化结果
plt.scatter(data[:, 0], data[:, 1], c=kmeans_pca.labels_, cmap='viridis', s=50)
plt.scatter(kmeans_pca.cluster_centers_[:, 0], kmeans_pca.cluster_centers_[:, 1], c='red', marker='X', s=200)
plt.title('KMeans Clustering (PCA-based Estimation)')
plt.show()
比较
目标 |
利用空间距离估计簇数,适用于高维数据 |
利用主要方差方向估计簇数,适用于线性分布的数据 |
计算复杂度 |
依赖于 O(n2)O(n^2)O(n2) 的邻居计算 |
依赖于 O(n⋅d2)O(n \cdot d^2)O(n⋅d2) 的协方差矩阵计算 |
优点 |
精确反映样本间的几何关系 |
能降维,减少噪声,提高聚类的可解释性 |
缺点 |
需要手动选择第 kkk-近邻的值,容易受噪声影响 |
不适用于簇形状复杂或非线性分布的数据 |
适用场景 |
数据簇之间间距较大,且分布较均匀 |
数据分布具有显著的主要方向,且簇数与主成分相关 |
- NearestNeighbors 更适合样本点间距离信息明显的情况,尤其是密度差异较大的数据。
- PCA 更适合数据具有高维结构且簇方向线性相关的场景。
在实际中,可以先对数据进行标准化,再结合这两种方法辅助选择 K。
TBC
标签:plt,
草稿,
KMeans,
kmeans,
聚类,
PCA,
data,
高维
From: https://www.cnblogs.com/Song-Meow/p/18599944