Python实现谱聚类算法并可视化显示
时间: 2023-05-31 19:06:51 浏览: 150
谱聚类是一种无监督的聚类算法,其基本思想是将数据集表示为一个图,利用图的谱特征进行聚类。下面介绍如何用Python实现谱聚类算法并可视化显示。
1. 数据准备
首先,我们需要准备一个数据集。这里我们使用sklearn库中的make_circles函数生成一个带有两个圆环的数据集。代码如下:
```
from sklearn.datasets import make_circles
X, y = make_circles(n_samples=1000, factor=0.5, noise=0.05)
```
2. 构建相似矩阵
接下来,我们需要构建一个相似矩阵。对于每一个数据点,我们可以计算它与其他点之间的相似度,然后将相似度转换为权重,构建一个权重矩阵。这里我们使用高斯核函数计算相似度。代码如下:
```
import numpy as np
def similarity_matrix(X, sigma=0.1):
n = X.shape[0]
W = np.zeros((n, n))
for i in range(n):
for j in range(i+1, n):
d = np.linalg.norm(X[i]-X[j])
W[i,j] = np.exp(-d**2/(2*sigma**2))
W[j,i] = W[i,j]
return W
W = similarity_matrix(X)
```
3. 构建拉普拉斯矩阵
接下来,我们需要构建拉普拉斯矩阵。拉普拉斯矩阵可以分为两种:对称归一化拉普拉斯矩阵和非对称归一化拉普拉斯矩阵。这里我们使用对称归一化拉普拉斯矩阵。代码如下:
```
def laplacian_matrix(W):
D = np.diag(W.sum(axis=1))
L = D - W
D_sqrt = np.sqrt(np.linalg.inv(D))
L_sym = np.dot(np.dot(D_sqrt, L), D_sqrt)
return L_sym
L = laplacian_matrix(W)
```
4. 计算特征向量
接下来,我们需要计算拉普拉斯矩阵的特征向量和特征值。代码如下:
```
eigvals, eigvecs = np.linalg.eig(L)
idx = eigvals.argsort()
eigvals = eigvals[idx]
eigvecs = eigvecs[:,idx]
```
5. 聚类
接下来,我们可以使用KMeans或者其他聚类算法对特征向量进行聚类。这里我们使用KMeans。代码如下:
```
from sklearn.cluster import KMeans
kmeans = KMeans(n_clusters=2)
kmeans.fit(eigvecs[:,:2])
labels = kmeans.labels_
```
6. 可视化
最后,我们可以将聚类结果可视化。代码如下:
```
import matplotlib.pyplot as plt
plt.scatter(X[:,0], X[:,1], c=labels)
plt.show()
```
完整代码如下:
```
from sklearn.datasets import make_circles
import numpy as np
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt
def similarity_matrix(X, sigma=0.1):
n = X.shape[0]
W = np.zeros((n, n))
for i in range(n):
for j in range(i+1, n):
d = np.linalg.norm(X[i]-X[j])
W[i,j] = np.exp(-d**2/(2*sigma**2))
W[j,i] = W[i,j]
return W
def laplacian_matrix(W):
D = np.diag(W.sum(axis=1))
L = D - W
D_sqrt = np.sqrt(np.linalg.inv(D))
L_sym = np.dot(np.dot(D_sqrt, L), D_sqrt)
return L_sym
X, y = make_circles(n_samples=1000, factor=0.5, noise=0.05)
W = similarity_matrix(X)
L = laplacian_matrix(W)
eigvals, eigvecs = np.linalg.eig(L)
idx = eigvals.argsort()
eigvals = eigvals[idx]
eigvecs = eigvecs[:,idx]
kmeans = KMeans(n_clusters=2)
kmeans.fit(eigvecs[:,:2])
labels = kmeans.labels_
plt.scatter(X[:,0], X[:,1], c=labels)
plt.show()
```
运行结果如下图所示:
![谱聚类结果](https://img-blog.csdnimg.cn/20220117181236395.png)
阅读全文