谱聚类的案例

1. 政治博客数据集(见附件Pol_Blogs_CSV文件)

数据集网址一: Political blogs

数据集网址二: http://www.casos.cs.cmu.edu/computational_tools/datasets/external/polblogs/index11.php 

政治博客数据是由Adamic和Glance于2005年收集并分析的. 该数据集包含了2004年美国总统选举前不久的1000多个网络日志的快照, 其中节点是网络日志, 边是超链接. 节点被标记为自由派或保守派, 这可以被视为两个定义明确的社区. 请尝试使用随机分块模型对这一数据集进行建模, 使用谱聚类算法对该数据集进行社区聚类, 并对所建模型及聚类结果给出合理的解释.

4】案例代码

#调用包
import networkx as nx
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
from collections import Counter
from sklearn.mixture import GaussianMixture
#忽视警告
import warnings
warnings.filterwarnings("ignore")

#调用表格信息对应的gml格式的文件
G=nx.read_gml("Pol_Blogs.gml")
#求社区数目
a = nx.get_node_attributes(G,'value')
#求节点总数和社区数
b = len(set(a))
c = len(set(a.values()))
print("节点总数",b)
print("社区数",c)

#存放节点属性值为0与1的总数
cout =Counter(a.values())
a0=cout[0]
a1=cout[1]
print("0与1的节点数",a0,a1)
A=np.array([a0,a1])
print(A)

#遍历所有边,求0-0,0-1,1-0,1-1四种类型边的数量
edge00=edge11=edge01=edge10=0
for i in G.edges:
#边的两点
    node1 , node2 = i
#查两点的属性值,以确认边的类型,然后矩阵中加一
    c1 = a[node1]
    c2 = a[node2]

    if c1 == c2 ==0:
        edge00= edge00 +1
    elif c1 == c2 ==1 :
        edge11 =1 +edge11
    elif c1==0 and c2 ==1:
        edge01 = 1+edge01
    else:
        edge10 = 1+edge10
print("四种类型的边分为为",edge00,edge11,edge01,edge10)
#社区内部的连接概率
#社区属性为0内的连接概率
p00 = edge00/(a0*(a0-1))
#社区属性为1内的连接概率
p11 = edge11/(a1*(a1-1))
#社区间连接概率
#社区属性从0到1的连接概率
p01 = edge01/(a0*a1)
#社区属性从1到0的连接概率
p10 = edge10/(a1*a0)

#构建概率矩阵
P =np.array([[p00,p01],[p10,p11]])
print("概率矩阵")
print(P)

#随机块模型
model = nx.stochastic_block_model(sizes=A,p=P,seed=100,directed=True)
nx.draw(model,with_labels=True)
plt.show()

#求拉普拉斯矩阵
L = nx.directed_laplacian_matrix(model).A
#求拉普拉斯矩阵的特征值e和特征向量v
lam, V = np.linalg.eig(L)
#选取k列作为特征矩阵
X=V[:, :2]
#将特征矩阵归一化
X = (X-X.mean(axis=0)/X.std(axis=0))
#使用GMM模型
gmm=GaussianMixture(n_components=2)
gmm.fit(X)
#获取点对应的标签
lables = gmm.predict(X)
#设定颜色以区分社区
colors = ["r"if lable==0else"b"for lable in lables]
nx.draw_networkx(model,pos=X,node_color=colors)
plt.show()

 

输出结果:

初始数据(不带标签):

谱聚类的案例_第1张图片

 

利用随机分块得到的模型

谱聚类的案例_第2张图片

 

谱聚类后

谱聚类的案例_第3张图片

 

其他输出:

谱聚类的案例_第4张图片

 

分析:

由图可以很明显的发现,政客博客存在两个社区,符合现实中政客存在的保守派和自由派两类人群。同时也说明,政客的派系会影响到其社交,相同派系的人联系亲密度要远高于派系间的亲密度,符合现实情况。

你可能感兴趣的:(聚类,数据挖掘)