高维向量聚类(草稿)

  • 对于容易出现维度灾难的高维向量序列聚类,在不知道聚类数量的情况下,可以使用基于密度的聚类方法dbscan;也可以通过估计聚类数量,再使用kmeans。对于kmeans,一般有以下处理方法:
  • 方法一:使用 NearestNeighbors 估计簇数量,然后用 KMeans 聚类

   NearestNeighbors 可以通过计算样本的 kkk-近邻距离,利用距离拐点的方法估计最优簇的数量。

    1. 使用 NearestNeighbors 计算每个样本的第 kkk-近邻距离(通常 k=min_samples+1k = min\_samples + 1k=min_samples+1)。
    2. 绘制距离曲线,寻找拐点。
    3. 使用拐点估计的簇数量初始化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 可以通过分析数据的主要方差方向估计潜在的簇数,通常观察累积解释方差比,选择主要贡献的主成分数作为簇数的估计值。

      1. 使用 PCA 对数据降维。
      2. 绘制累积解释方差比,选择一个拐点估计主要成分的数量。
      3. 使用估计的成分数作为簇数输入到 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()
复制代码

 

     比较
特性NearestNeighborsPCA
目标 利用空间距离估计簇数,适用于高维数据 利用主要方差方向估计簇数,适用于线性分布的数据
计算复杂度 依赖于 O(n2)O(n^2)O(n2) 的邻居计算 依赖于 O(n⋅d2)O(n \cdot d^2)O(nd2) 的协方差矩阵计算
优点 精确反映样本间的几何关系 能降维,减少噪声,提高聚类的可解释性
缺点 需要手动选择第 kkk-近邻的值,容易受噪声影响 不适用于簇形状复杂或非线性分布的数据
适用场景 数据簇之间间距较大,且分布较均匀 数据分布具有显著的主要方向,且簇数与主成分相关
  1. NearestNeighbors 更适合样本点间距离信息明显的情况,尤其是密度差异较大的数据。
  2. PCA 更适合数据具有高维结构且簇方向线性相关的场景。
    在实际中,可以先对数据进行标准化,再结合这两种方法辅助选择 K
    TBC

posted on   Mju_halcyon  阅读(51)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

导航

统计

点击右上角即可分享
微信分享提示