python实现谱聚类算法

谱聚类的理论

Python实现谱聚类

import matplotlib.pyplot as plt
from itertools import cycle, islice
import numpy as np
from sklearn.cluster import KMeans
from sklearn import datasets

# 生成数据集
def genTwoCircles(n_samples=1000):
    x,y = datasets.make_circles(n_samples, factor=0.5, noise=0.05)
    return x, y

# 通过 KNN 算法,计算相似度矩阵
def myKNN(S, k, sigma=1.0):
    N = len(S)
    A = np.zeros((N,N))

    for i in range(N):
        dist_with_index = zip(S[i], range(N))
        dist_with_index = sorted(dist_with_index, key=lambda x:x[0])
        neighbours_id = [dist_with_index[m][1] for m in 
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
谱聚类是一种无监督的聚类算法,其基本思想是将数据集表示为一个图,利用图的特征进行聚类。下面介绍如何用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)

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值