Scikit频谱聚类无法对同心圆进行分类 [英] Scikit Spectral Clustering fails to classify concentric circles

查看:22
本文介绍了Scikit频谱聚类无法对同心圆进行分类的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

以下是设置群集问题的一些代码:

import numpy as np
import matplotlib.pyplot as plt

# KMeans
# # Class=2
# Center(2.5,2.5), r1 = 2, r2 = 1
X1 = np.zeros(500*4)
X2 = np.zeros(500*4)

r1 = 2; r2 = 1; a = 2.5; b = 2.5 # generate circle

h = np.random.uniform(0, 2*np.pi, 1000)
noise = np.random.normal(0, 0.1, 1000)
X1[:1000] = np.cos(h) * r1 + a + noise
noise = np.random.normal(0, 0.1, 1000)
X2[:1000] = np.sin(h) * r1 + a + noise

h = np.random.uniform(0, 2*np.pi, 1000)
noise = np.random.normal(0, 0.1, 1000)
X1[1000:] = np.cos(h) * r2 + b + noise
noise = np.random.normal(0, 0.1, 1000)
X2[1000:] = np.sin(h) * r2 + b + noise

X = np.array([X1,X2]).T

plt.figure(figsize=(4,4))
plt.scatter(X[:,0],X[:,1])
从下图中,我们假设有两个集群。内圈中的所有点应属于一个点,外圈应属于另一个点。

通过SCRICIT-LEARN,我们使用RBF内核编写了以下代码:

from sklearn.cluster import SpectralClustering
clustering = SpectralClustering(n_clusters=2,assign_labels='kmeans', affinity='rbf',random_state=0).fit(X)
print(clustering.labels_)

plt.figure(figsize=(4,4))
X_C1 = np.array([X[i,:] for i in range(len(clustering.labels_)) if clustering.labels_[i] == 1])
X_C2 = np.array([X[i,:] for i in range(len(clustering.labels_)) if clustering.labels_[i] == 0])
plt.scatter(X_C1[:,0],X_C1[:,1],c="blue")
plt.scatter(X_C2[:,0],X_C2[:,1],c="red")
plt.show()

但似乎频谱聚类不起作用(作为糟糕的KMeans聚类)。那么这里的问题是什么呢?

推荐答案

默认gamma=1.0参数对于此应用程序来说不够高。

尝试gamma=6.0

from sklearn.cluster import SpectralClustering

clustering = SpectralClustering(n_clusters=2, gamma=6.0).fit(X)

plt.scatter(X[:, 0], X[:, 1], c=clustering.labels_)
plt.show()

这篇关于Scikit频谱聚类无法对同心圆进行分类的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆