完整的最简单的谱聚类python代码
来源:互联网 发布:js 自定义window对象 编辑:程序博客网 时间:2024/06/04 23:25
http://blog.csdn.net/waleking/article/details/7584084
针对karate_club数据集,做了谱聚类。由于是2-way clustering,比较简单,得到了图的新的表示空间之后,没有做k-means,仅仅针对正规化后的拉普拉斯矩阵的第二特征值做了符号判断,这和 Spectral Clustering Tutorial 一文中的描述一致。
引用了numpy scipy matplotlib networkx包
#coding=utf-8
#MSC means Multiple Spectral Clustering
import numpy as np
import scipy as sp
import scipy.linalg as linalg
import networkx as nx
import matplotlib.pyplot as plt
def getNormLaplacian(W):
"""input matrix W=(w_ij)
"compute D=diag(d1,...dn)
"and L=D-W
"and Lbar=D^(-1/2)LD^(-1/2)
"return Lbar
"""
d=[np.sum(row) for row in W]
D=np.diag(d)
L=D-W
#Dn=D^(-1/2)
Dn=np.power(np.linalg.matrix_power(D,-1),0.5)
Lbar=np.dot(np.dot(Dn,L),Dn)
return Lbar
def getKSmallestEigVec(Lbar,k):
"""input
"matrix Lbar and k
"return
"k smallest eigen values and their corresponding eigen vectors
"""
eigval,eigvec=linalg.eig(Lbar)
dim=len(eigval)
#查找前k小的eigval
dictEigval=dict(zip(eigval,range(0,dim)))
kEig=np.sort(eigval)[0:k]
ix=[dictEigval[k] for k in kEig]
return eigval[ix],eigvec[:,ix]
def checkResult(Lbar,eigvec,eigval,k):
"""
"input
"matrix Lbar and k eig values and k eig vectors
"print norm(Lbar*eigvec[:,i]-lamda[i]*eigvec[:,i])
"""
check=[np.dot(Lbar,eigvec[:,i])-eigval[i]*eigvec[:,i] for i in range(0,k)]
length=[np.linalg.norm(e) for e in check]/np.spacing(1)
print("Lbar*v-lamda*v are %s*%s" % (length,np.spacing(1)))
g=nx.karate_club_graph()
nodeNum=len(g.nodes())
m=nx.to_numpy_matrix(g)
Lbar=getNormLaplacian(m)
k=2
kEigVal,kEigVec=getKSmallestEigVec(Lbar,k)
print("k eig val are %s" % kEigVal)
print("k eig vec are %s" % kEigVec)
checkResult(Lbar,kEigVec,kEigVal,k)
#跳过k means,用最简单的符号判别的方法来求点的归属
clusterA=[i for i in range(0,nodeNum) if kEigVec[i,1]>0]
clusterB=[i for i in range(0,nodeNum) if kEigVec[i,1]<0]
#draw graph
colList=dict.fromkeys(g.nodes())
for node,score in colList.items():
if node in clusterA:
colList[node]=0
else:
colList[node]=0.6
plt.figure(figsize=(8,8))
pos=nx.spring_layout(g)
nx.draw_networkx_edges(g,pos,alpha=0.4)
nx.draw_networkx_nodes(g,pos,nodelist=colList.keys(),
node_color=colList.values(),
cmap=plt.cm.Reds_r)
nx.draw_networkx_labels(g,pos,font_size=10,font_family='sans-serif')
plt.axis('off')
plt.title("karate_club spectral clustering")
plt.savefig("spectral_clustering_result.png")
plt.show()
0 0
- 完整的最简单的谱聚类python代码
- 完整的最简单的谱聚类python代码
- 完整的最简单的谱聚类python代码
- 最简单的java文件行数完整代码!
- 最简单的完整策略
- 最简单的代码
- 最简单的 MRTs(Multi Render Targets)的完整代码示例【OpenGL】
- 小白学python(一) 最简单的代码片段
- 最简单的Python爬取web图片代码
- python编程(最简单的rpc代码)
- 最简单的PBO(异步Read-Back)Demo 完整代码示例
- C#最简单最完整的webservice实例
- C#最简单最完整的webservice实例
- C#最简单最完整的webservice实例 VS2008
- 完整的简单层拖动代码
- 简单的ajax评论完整代码
- 完整的图片去噪代码(python)
- 最简单的struts2代码
- AIX smitty安装软件时提示Unpack: file out of phase
- 第四课输入时的细节处理——C#计算器编程教学
- linux input subsystem虚拟键盘和鼠标
- Spring混合框架(Hibernate+JDBC/iBatis)的事务管理
- 剖析云计算中的“共享型数据库”
- 完整的最简单的谱聚类python代码
- UIButton
- 一个函数对象
- ipv4和ipv6比较
- maven update project 的问题
- 铺手机页面
- Android 初识 MVC、MVP框架
- SqlmapApi提供的接口说明
- datagrid 内嵌 combotree 显示 valueField 而不是 valueText 的解决办法