Matlab、Python实现Spectral Clustering算法(每行代码标注详细注解)

本文详细介绍了SpectralClustering算法,包括其原理、步骤(邻接矩阵构建、拉普拉斯矩阵、特征向量计算和聚类),并提供了Matlab和Python的代码示例,展示了其在处理非线性可分数据上的优势。
摘要由CSDN通过智能技术生成

Spectral Clustering算法是一种基于图论的聚类算法,它可以将数据点按照图结构进行划分,发现复杂和非线性可分的结构。在这篇博客中,我将介绍Spectral Clustering算法的原理和步骤,并给出用Matlab以及python实现的代码示例。

目录

一、什么是Spectral Clustering算法

二、Spectral Clustering算法的意义

三、如何实现Spectral Clustering算法

1.Spectral Clustering算法实现的大致思想

2.Matlab实现Spectral Clustering算法,每行标注详细注解

3.python实现Spectral Clustering算法,每行标注详细注解

这里是希望和大家一起进步的小高,愿意和读者们热情探讨😊


一、什么是Spectral Clustering算法

       谱聚类的原理是将数据集中的对象看作是一个图(graph)中的节点(node),然后根据节点之间的相似度或者距离来构建一个邻接矩阵(adjacency matrix)。邻接矩阵表示了图中节点之间是否相连以及相连程度。然后通过对邻接矩阵进行特征值分解(eigenvalue decomposition),得到一组特征向量(eigenvector),并且将它们作为新的数据表示。最后,通过对特征向量进行k-means或者其他聚类方法,得到最终的簇划分。

       谱聚类的核心思想是利用图的谱性质(spectral property),即图的结构信息可以通过其邻接矩阵或者拉普拉斯矩阵(Laplacian matrix)的特征值和特征向量来反映。特别地,图中最小的k个非零特征值对应的特征向量可以用来刻画图中最优的k个簇,这是由图划分理论(graph partitioning theory)所证明的。

二、Spectral Clustering算法的意义

Spectral Clustering算法的意义在于,它可以处理一些传统的基于距离或密度的聚类算法难以处理的数据分布,例如环形、螺旋形、月牙形等。如下图所示,这些数据分布在二维空间中是非线性可分的,也就是说,没有一条直线或曲线可以将它们完美地划分为不同的簇。而Spectral Clustering算法可以通过构建相似度矩阵和拉普拉斯矩阵,将这些数据点映射到一个更高维或更低维的空间中,使得它们在新的空间中变得线性可分,从而可以用k-means算法进行聚类。

Spectral Clustering算法相比其他聚类算法有以下一些优势:

  • 它可以利用不同的相似度度量和核函数来适应不同的数据特征和需求。例如,如果数据点之间的相似度是基于高斯核函数,那么Spectral Clustering算法就相当于在高斯核映射后的特征空间中进行聚类。
  • 它可以通过特征值分解和k-means聚类来实现,计算复杂度相对较低。特别是当数据点的个数很大时,我们可以使用一些近似方法来加速特征值分解的过程,例如随机投影、Nyström方法等。
  • 它可以生成一个谱图,表示数据点之间的相似度关系,方便进行可视化和分析。谱图是一个以数据点为节点,以相似度为边权重的图,它可以反映数据点之间的结构和模式。

三、如何实现Spectral Clustering算法

1.Spectral Clustering算法实现的大致思想

具体地,谱聚类算法可以分为以下几个步骤:

  • 构建邻接矩阵:给定一个数据集X,其中包含n个对象,每个对象有p个属性。首先计算每两个对象之间的相似度或者距离,然后根据一定的规则来构建一个n乘n的邻接矩阵A。常用的规则有以下几种:
    • K近邻法(KNN):对于每个对象,只与其最近的K个对象相连,即A[i,j]=1当且仅当对象i和j是彼此最近的K个对象之一,否则A[i,j]=0。
    • ε-邻域法(ε-neighborhood):对于每个对象,只与其距离小于ε的对象相连,即A[i,j]=1当且仅当对象i和j之间的距离小于ε,否则A[i,j]=0。
    • 全连接法(fully connected):对于每个对象,与所有其他对象相连,即A[i,j]等于对象i和j之间的相似度或者距离。
  • 构建拉普拉斯矩阵:根据邻接矩阵A来构建一个拉普拉斯矩阵L。拉普拉斯矩阵有多种定义方式,常用的有以下几种:
    • 无向图拉普拉斯矩阵(unnormalized graph Laplacian):L=D-A,其中D是一个对角矩阵,D[i,i]等于A第i行元素之和,即节点i的度数(degree)。
    • 规范化对称拉普拉斯矩阵(normalized symmetric Laplacian):L=I-D(-1/2)AD(-1/2),其中I是一个单位矩阵。
    • 规范化随机游走拉普拉斯矩阵(normalized random walk Laplacian):L=I-D^(-1)A。
  • 计算特征值和特征向量:对拉普拉斯矩阵L进行特征值分解,得到一组特征值和特征向量。选择最小的k个非零特征值对应的特征向量,将它们组成一个n乘k的矩阵V,其中每一行表示一个对象在新的特征空间中的坐标。
  • 进行聚类:对矩阵V中的每一行(即每个对象)进行k-means或者其他聚类方法,得到最终的簇划分

2.Matlab实现Spectral Clustering算法,每行标注详细注解

为了帮助更好地理解Spectral Clustering算法的步骤,编写了一个用Matlab实现的代码示例,并对每一行进行了注释。代码如下:

% 生成一个随机数据集
rng(1); % 设置随机数种子
X = [randn(10,2)+ones(10,2); randn(10,2)-ones(10,2)]; % 生成20个二维数据点

% 画出数据点的散点图
figure;
plot(X(:,1),X(:,2),'o'); % 画出数据点
title('Random Data Set'); % 设置标题
xlabel('x1'); % 设置x轴标签
ylabel('x2'); % 设置y轴标签

% 构建相似度矩阵
dist_temp = pdist(X); % 计算每对数据点之间的欧氏距离
dist = squareform(dist_temp); % 将距离转化为对称矩阵
S = exp(-dist.^2); % 使用高斯核函数计算相似度

% 构建拉普拉斯矩阵
D = diag(sum(S,2)); % 计算度矩阵
L = eye(20) - D^(-1/2)*S*D^(-1/2); % 计算标准化对称拉普拉斯矩阵

% 计算特征值和特征向量
[V,D] = eigs(L,2,'smallestabs'); % 计算最小的两个特征值和对应的特征向量

% 进行k-means聚类
idx = kmeans(V,2); % 将特征向量划分为两个簇

% 画出聚类结果的散点图
figure;
gscatter(X(:,1),X(:,2),idx); % 画出不同颜色的数据点
title('Cluster Result'); % 设置标题
xlabel('x1'); % 设置x轴标签
ylabel('x2'); % 设置y轴标签

3.python实现Spectral Clustering算法,每行标注详细注解

最后编写了一个用python实现的代码示例,并对每一行进行了注释。代码如下:

# 导入所需的库
import numpy as np # 用于数值计算
import matplotlib.pyplot as plt # 用于绘图
from sklearn.datasets import make_moons # 用于生成数据集
from sklearn.cluster import KMeans # 用于进行k-means聚类
from sklearn.metrics.pairwise import rbf_kernel # 用于计算高斯核函数
from sklearn.metrics import adjusted_rand_score # 用于评估聚类效果

# 生成一个包含两个月牙形簇的数据集,共有300个样本,每个样本有两个属性
X, y = make_moons(n_samples=300, noise=0.1)

# 绘制数据集的散点图,不同颜色表示真实的簇标签
plt.scatter(X[:,0], X[:,1], c=y)
plt.title('True labels')
plt.show()

# 使用k-means算法对数据集进行聚类,指定簇的个数为2
kmeans = KMeans(n_clusters=2)
kmeans.fit(X) # 训练模型
y_pred_kmeans = kmeans.labels_ # 获取预测的簇标签

# 绘制k-means聚类的结果,不同颜色表示预测的簇标签
plt.scatter(X[:,0], X[:,1], c=y_pred_kmeans)
plt.title('K-means clustering')
plt.show()

# 计算k-means聚类的调整兰德指数(Adjusted Rand Index),用于评估聚类效果,取值范围是[-1,1],越接近1表示越好
ari_kmeans = adjusted_rand_score(y, y_pred_kmeans)
print(f'ARI of k-means: {ari_kmeans:.4f}')

# 使用谱聚类算法对数据集进行聚类,指定簇的个数为2
n_clusters = 2 # 簇的个数
gamma = 10 # 高斯核函数的参数

# 构建邻接矩阵,使用高斯核函数计算相似度
A = rbf_kernel(X, gamma=gamma)

# 构建拉普拉斯矩阵,使用规范化对称拉普拉斯矩阵
D = np.diag(np.sum(A, axis=1)) # 计算度数矩阵
L = np.identity(n_samples) - np.linalg.inv(D ** 0.5) @ A @ np.linalg.inv(D ** 0.5) # 计算规范化对称拉普拉斯矩阵

# 计算特征值和特征向量,选择最小的k个非零特征值对应的特征向量
eigval, eigvec = np.linalg.eig(L) # 计算特征值分解
idx = np.argsort(eigval)[:n_clusters] # 获取最小的k个非零特征值的索引
V = eigvec[:, idx]

# 进行聚类,使用k-means算法对特征向量进行聚类
kmeans = KMeans(n_clusters=n_clusters)
kmeans.fit(V) # 训练模型
y_pred_spectral = kmeans.labels_ # 获取预测的簇标签

# 绘制谱聚类的结果,不同颜色表示预测的簇标签
plt.scatter(X[:,0], X[:,1], c=y_pred_spectral)
plt.title('Spectral clustering')
plt.show()

# 计算谱聚类的调整兰德指数(Adjusted Rand Index),用于评估聚类效果,取值范围是[-1,1],越接近1表示越好
ari_spectral = adjusted_rand_score(y, y_pred_spectral)
print(f'ARI of spectral clustering: {ari_spectral:.4f}')

这里是希望和大家一起进步的小高,愿意和读者们热情探讨😊

要在Python实现SSC聚类算法,可以按照以下步骤进行: 1. 导入所需的库和模块,例如numpy、scipy和sklearn等。 2. 定义一个函数来计算稀疏表示。这可以使用L1正则化的线性回归方法,例如Lasso回归或Elastic Net回归。 3. 定义一个函数来计算子空间聚类。这可以使用spectral clustering方法,其中相似度矩阵是通过计算数据点之间的稀疏表示来构建的。 4. 定义一个主函数来调用上述两个函数,并将数据作为输入。在主函数中,首先计算数据点之间的稀疏表示,然后使用spectral clustering方法进行聚类。 下面是一个简单的示例代码,展示了如何在Python实现SSC聚类算法: ```python import numpy as np from sklearn.cluster import SpectralClustering from sklearn.linear_model import Lasso def compute_sparse_representation(data): # 使用Lasso回归计算稀疏表示 lasso = Lasso(alpha=0.1) sparse_rep = lasso.fit_transform(data.T, data.T) return sparse_rep def ssc_clustering(data, n_clusters): # 计算数据点之间的稀疏表示 sparse_rep = compute_sparse_representation(data) # 使用spectral clustering进行聚类 clustering = SpectralClustering(n_clusters=n_clusters, affinity='precomputed') labels = clustering.fit_predict(sparse_rep) return labels def main(): # 生成示例数据 data = np.random.rand(100, 10) # 调用SSC聚类算法 labels = ssc_clustering(data, n_clusters=3) print(labels) if __name__ == '__main__': main() ``` 请注意,这只是一个简单的示例代码,实际应用中可能需要根据具体情况进行调整和优化。另外,还可以根据需要添加其他功能,例如数据预处理和结果可视化等。 #### 引用[.reference_title] - *1* *2* [Subspace Clustering 学习----稀疏子空间聚类(SSC)](https://blog.csdn.net/tang1136/article/details/120729676)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Gavana.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值