如何对包含三个不同类别的三圈数据集执行Spectral Clustering(谱聚类)
三圈同心数据集谱聚类实现
数据集构造
你提供的代码可生成带噪声的三类别同心环形数据集,代码如下:
from sklearn.datasets import make_circles import seaborn as sns import pandas as pd import numpy as np from sklearn.cluster import SpectralClustering import matplotlib.pyplot as plt # 生成两层环形数据,拼接得到三层环形数据集 X_small, y_small = make_circles(n_samples=(100,200), random_state=3, noise=0.07, factor = 0.7) X_large, y_large = make_circles(n_samples=(100,200), random_state=3, noise=0.07, factor = 0.4) y_large[y_large==1] = 2 # 构造数据集DataFrame df = pd.DataFrame(np.vstack([X_small,X_large]),columns=['x1','x2']) df['label'] = np.hstack([y_small,y_large]) # 查看原始数据集标签分布 print(df.label.value_counts()) # 可视化原始数据集 sns.scatterplot(data=df,x='x1',y='x2',hue='label',style='label',palette="bright") plt.show()
生成的数据集可视化效果如下:
谱聚类执行
针对环形非凸数据集,选择*径向基函数(RBF)*作为亲和度计算方式,设置聚类数为3即可完成分类,实现代码如下:
# 初始化谱聚类模型 sc = SpectralClustering(n_clusters=3, affinity='rbf', random_state=42, gamma=50) # 拟合数据并得到聚类标签 df['spectral_label'] = sc.fit_predict(df[['x1','x2']]) # 可视化聚类结果 plt.figure(figsize=(8,6)) sns.scatterplot(data=df, x='x1', y='x2', hue='spectral_label', style='spectral_label', palette="bright") plt.title("谱聚类结果") plt.show()
参数说明
n_clusters=3:指定聚类数量为3,对应三个同心环类别affinity='rbf':使用径向基函数计算样本亲和度,适配非凸的环形数据分布gamma=50:RBF核的带宽参数,可根据噪声大小调整,数值越大对局部邻域越敏感
运行代码后即可得到和原始标签对齐的聚类结果,谱聚类可以很好的区分不同半径的环形数据。
内容的提问来源于stack exchange,提问作者Ytt
相关产品推荐
相关产品推荐

