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()
输出结果:
初始数据(不带标签):
利用随机分块得到的模型
谱聚类后
其他输出:
分析:
由图可以很明显的发现,政客博客存在两个社区,符合现实中政客存在的保守派和自由派两类人群。同时也说明,政客的派系会影响到其社交,相同派系的人联系亲密度要远高于派系间的亲密度,符合现实情况。