Python: 手工代码之---谱聚类 Spectral Clustering

参考博客:https://blog.csdn.net/songbinxu/article/details/80838865

修正原文中代码瑕疵!

 

谱聚类

import pandas as pd
import numpy as np
from scipy.spatial.distance import pdist,squareform
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
from sklearn import datasets
from itertools import cycle,islice

def genTwoCircles(n_samples=1000):
    X,y = datasets.make_circles(n_samples,factor=0.5,noise=0.05)
    return X,y

def distance(A,B):           #计算两点之间距离   距离计算不一样
    return np.linalg.norm(A-B)

def adjacentMatrix_KNN(data,k,sigma=1.0):       #利用KNN获取邻接矩阵
    n = len(data)
    dist_matrix = squareform(pdist(data,metric='euclidean'))
    AdjMat = np.zeros((n,n))
    for i in range(n):
        dist_with_index = zip(dist_matrix[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 range(k+1)]
        for j in neighbours_id:
            AdjMat[i,j] = np.exp(-((dist_matrix[i,j])**2)/2/sigma/sigma)
            AdjMat[j,i] = AdjMat[i,j]
    return AdjMat

    # '''
    # for idx,each in enumerate(dist_matrix):
    #     index_array = np.argsort(each)
    #     AdjMat[idx][index_array[1:k+1]] = 1
    #     # for i in range(n):
    #     #     for j in range(n):
    #     #         AdjMat[i]
    # AdjMatrix = (AdjMat + AdjMat.T)/2
    # return AdjMatrix
    # '''

def LaplacianMatrix(adjacentMatrix):  #获取标准的拉普拉斯矩阵
    # compute the Degree Matrix: D = diag(sum(邻接矩阵))
    degreeMatrix = np.sum(adjacentMatrix,axis=1)
    #计算拉普拉斯矩阵: L= D-A
    laplacianMatrix = np.diag(degreeMatrix) - adjacentMatrix
    #下面是进行标准化normalize :D^(-1/2) L D^(-1/2)
    sqrtDegreeMatrix = np.diag(1.0 / (degreeMatrix ** (0.5)))
    return np.dot(np.dot(sqrtDegreeMatrix,laplacianMatrix),sqrtDegreeMatrix)

def getEigVec(LaMat,n_cluster):           #获取k个最小特征值
    eigVal,eigVec = np.linalg.eig(LaMat)
    # index_eigVal = np.argsort(eigVal)
    # O_index = index_eigVal[0:n_cluster]
    # O_eigVec = eigVec[:,O_index]
    # return np.real(O_eigVec)
    return np.real(eigVec)
def plot(X,y_sp,y_km):
    colors = np.array(list(islice(cycle(['#377eb8', '#ff7f00', '#4daf4a','#f781bf', '#a65628', '#984ea3', '#999999', '#e41a1c', '#dede00']),int(max(y_km) + 1))))
    plt.subplot(121)
    plt.scatter(X[:,0], X[:,1], s=10, color=colors[y_sp])
    plt.title("Spectral Clustering")
    plt.subplot(122)
    plt.scatter(X[:,0], X[:,1], s=10, color=colors[y_km])
    plt.title("Kmeans Clustering")
    plt.show()
if __name__ =="__main__":
    #获取数据
    # data1 = np.loadtxt(r'E:\dataset\clusterData\ringData.txt')
    # data2 = np.loadtxt(r'E:\dataset\clusterData\Gaussian.txt')
    # y1 = np.zeros((len(data1),1))
    # y2 = np.ones((len(data2),1))
    # X = np.vstack((data1,data2))  #数据
    # y = np.vstack((y1,y2))        #真实标记

    X,y = genTwoCircles(n_samples=1000)
    k = 2
    A = adjacentMatrix_KNN(X,5,sigma=1.0)
    LapMat = LaplacianMatrix(A)
    H = getEigVec(LapMat,n_cluster=k)
    y_sp = KMeans(n_clusters=k).fit_predict(H)
    y_km = KMeans(n_clusters=k).fit_predict(X)
    plot(X,y_sp,y_km)

 

谱聚类spectral clustering)是一种基于图论的聚类算法,适用于无法使用传统聚类算法(如K-means)有效划分的数据。谱聚类的核心思想是将数据集转换成图形结构,利用图的谱分解来实现聚类。 在Python中,有一个常用的谱聚类库是scikit-learn的`SpectralClustering`。该库提供了一种简单且高效的方法来执行谱聚类。 使用`SpectralClustering`库进行谱聚类的步骤如下: 1. 导入库:首先需要导入`SpectralClustering`库。 ```python from sklearn.cluster import SpectralClustering ``` 2. 创建模型:使用`SpectralClustering`函数创建一个谱聚类模型对象,并传入相关参数。 ```python model = SpectralClustering(n_clusters=2, affinity='nearest_neighbors') ``` 其中,`n_clusters`表示需要聚类的簇数,`affinity`表示相似度的计算方法,常用的选项包括`nearest_neighbors`和`rbf`。 3. 训练模型:使用`fit`函数训练模型,传入需要进行聚类的数据。 ```python model.fit(data) ``` 4. 获取聚类结果:通过访问模型的`labels_`属性,可以获取到每个样本的聚类标签。 ```python cluster_labels = model.labels_ ``` 聚类标签是一个表示每个样本所属簇的数组。 总结来说,Python谱聚类库提供了一个方便而有效的方式来执行谱聚类。通过导入库、创建模型、训练模型和获取聚类结果的步骤,可以轻松地使用谱聚类算法对数据进行聚类分析。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

DeniuHe

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

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

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

打赏作者

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

抵扣说明:

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

余额充值