机器学习(十一)谱聚类算法

来源:互联网 发布:oracle linux 编辑:程序博客网 时间:2024/05/16 14:33

谱聚类算法

原文地址:http://blog.csdn.NET/hjimce/article/details/45749757

作者:hjimce

一、算法概述

    谱聚类算法建立在谱图理论基础上,与传统的聚类算法相比,它具有能在任意形状的样本空间上聚类且收敛于全局最优解的优点。  谱聚类的求解方法有很多种,其中比较简单常用的是Nomarlized cut。其算法流程如下:

1、采用knn搜索最近k邻样本,然后构造样本相似度稀疏矩阵W(N,N)(如果不采用knn,那么构造的是全连接图,不是稀疏矩阵,如果样本多的话,求解起来速度就会很慢了),两样本之间的相似度度量可采用如下公式:


这边先定义W的对角线元素为0(Wii=0),然后归一化这个W矩阵的每一行和为1。

2、对W矩阵做归一化处理后,构造归一化的拉普拉斯矩阵L(归一化的拉普拉斯矩阵的对角线元素为1,每一行所有元素和为0),即:

L=I-W

3、求解L矩阵的前k个最小特征值对应的特征向量(k为聚类的个数),然后把这K个特征向量竖着并排在一起,形成一个新的特征向量空间数据E(N,K)的矩阵。这样E每一行对应于原始数据的每一个样本,然后我们对这N行数据做k-means聚类(也可以用其它的聚类方法),得到的聚类结果就是谱聚类的结果。

二、源码实践

[python] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. #coding=utf-8  
  2. import numpy as np  
  3. import matplotlib.pyplot as plt  
  4. from sklearn.cluster   import KMeans  
  5. import random  
  6.   
  7. #生成两个高斯分布训练样本用于测试  
  8. #第一类样本类  
  9. mean1 = [00]  
  10. cov1 = [[10], [01]]  # 协方差矩阵  
  11. x1, y1= np.random.multivariate_normal(mean1, cov1, 100).T  
  12.   
  13. data=[]  
  14. for x,y in zip(x1,y1):  
  15.     data.append([x,y])  
  16. #第二类样本类  
  17. mean2 = [3,3]  
  18. cov2 = [[10], [01]]  # 协方差矩阵  
  19. x2, y2= np.random.multivariate_normal(mean2, cov2, 100).T  
  20. for x,y in zip(x2,y2):  
  21.     data.append([x,y])  
  22. random.shuffle(data)#打乱数据  
  23. data=np.asarray(data,dtype=np.float32)  
  24.   
  25.   
  26.   
  27.   
  28.   
  29.   
  30. #算法开始  
  31. #计算两两样本之间的权重矩阵,在真正使用场景中,样本很多,可以只计算邻接顶点的权重矩阵  
  32. m,n=data.shape  
  33. distance=np.zeros((m,m),dtype=np.float32)  
  34.   
  35. for i in range(m):  
  36.     for j in range(m):  
  37.         if i==j:  
  38.             continue  
  39.         dis=sum((data[i]-data[j])**2)  
  40.         distance[i,j]=dis  
  41. #构建归一化拉普拉斯矩阵  
  42. similarity = np.exp(-1.* distance/distance.std())  
  43. for i in range(m):  
  44.     similarity[i,i]=0  
  45.   
  46. for i in range(m):  
  47.     similarity[i]=-similarity[i]/sum(similarity[i])#归一化操作  
  48.     similarity[i,i]=1#拉普拉斯矩阵的每一行和为0,对角线元素之为1  
  49.   
  50.   
  51. #计算拉普拉斯矩阵的前k个最小特征值  
  52. [Q,V]=np.linalg.eig(similarity)  
  53. idx = Q.argsort()  
  54. Q = Q[idx]  
  55. V = V[:,idx]  
  56. #前3个最小特征值  
  57. num_clusters =3  
  58. newd=V[:,:3]  
  59.   
  60. #k均值聚类  
  61. clf = KMeans(n_clusters=num_clusters)  
  62. clf.fit(newd)  
  63. #显示结果  
  64. for i in range(data.shape[0]):  
  65.     if clf.labels_[i]==0:  
  66.         plt.plot(data[i,0], data[i,1], 'go')  
  67.     elif clf.labels_[i]==1:  
  68.         plt.plot(data[i,0], data[i,1], 'ro')  
  69.     elif clf.labels_[i]==2:  
  70.         plt.plot(data[i,0], data[i,1], 'yo')  
  71.     elif clf.labels_[i]==3:  
  72.         plt.plot(data[i,0], data[i,1], 'bo')  
  73.   
  74.   
  75. plt.show()  
聚类结果:


参考文献:

1、http://liuzhiqiangruc.iteye.com/blog/2117144

************************作者:hjimce     联系qq:1393852684原创文章,转载请保留作者、原文地址信息*************


0 0