一、图数据概述
import pandas as pd # 导入Pandas库
import networkx as nx # 导入NetworkX库
import matplotlib.pyplot as plt # 导入Matplotlib库
# 创建一个DataFrame,其中包含两个人之间的关系
df = pd.DataFrame([("Dave", "Jenny"), ("Peter", "Jenny"), ("John", "Jenny"),
("Dave", "Peter"), ("Dave", "John"), ("Peter", "Sam"),
("Sam", "Albert"), ("Peter", "John")], columns=['from', 'to'])
# 创建一个无向图
G = nx.from_pandas_edgelist(df, 'from', 'to')
# 绘制图,显示节点标签,节点颜色为浅蓝色,节点大小为600
nx.draw(G, with_labels=True, node_color='lightblue', node_size=600)
# 显示图形
plt.show()
# 使用nx.DiGraph创建一个有向图
G = nx.from_pandas_edgelist(df, 'from', 'to',
create_using=nx.DiGraph())
# 绘制有向图,显示节点标签,节点颜色为浅蓝色,节点大小为600
nx.draw(G, with_labels=True, node_color='lightblue', node_size=600)
# 显示图形
plt.show()
二、基本中心度分析
c_degree= nx.degree_centrality(G)
c_degree
# 打印“介数”字串
print('Betweenness: ')
# 计算图G的介数中心性,未归一化
betweenness_centrality_unnormalized = nx.betweenness_centrality(G, normalized=False)
print(betweenness_centrality_unnormalized)
# 计算图G的介数中心性,已归一化
betweenness_centrality_normalized = nx.betweenness_centrality(G)
print(betweenness_centrality_normalized)
第一行 print 输出的是未归一化的介数中心性,这意味着返回的结果没有除以最大可能的介数中心性值。第二行 print 输出的是归一化的介数中心性,即介数中心性值被除以最大可能的介数中心性值,使得结果在0到1之间。
#
print(nx.closeness_centrality(G))
三、Web中心度分析
四、Pagerank
N = np.array([[0,1/2,0,0],
[1/3,0,0,1/2],
[1/3,0,0,1/2],
[1/3,1/2,0,0]])
N
NT=N.T
NT
A=np.array([1/4,1/4,1/4,1/4])
C=[]
for i in range(100):
B=NT.dot(A)
A=B
C.append(B)
C[99]
# 第一段代码:
N = np.array([[0, 0, 0, 1, 0],
[0, 0, 0.5, 0, 0.5],
[1, 0, 0, 0, 0],
[0, 0.33, 0.33, 0, 0.33],
[0.1, 0, 0, 0, 0]])
# 第二段代码:
Nr = np.full((5, 5), 0.2)
M = 0.9*N + 0.1*Nr
# 计算 M 转置后的特征值和特征向量
eigenvalues, eigenvectors=np.linalg.eig(M.T)
# 输出特征值
eigenvalues
# 导入NumPy库
import numpy as np
# 定义矩阵A
A = np.array([[0, 1, 1],
[0, 0, 1],
[1, 0, 0]])
# 定义矩阵N
N = np.array([[0, 1/2, 1/2],
[0, 0, 1],
[1, 0, 0]])
# 获取N的转置
Nt = N.T
# 创建一个3x3的矩阵,每个元素都是1/3
m = (1/3)*np.ones((3, 3))
# 定义矩阵A,它是Nt和m的加权和
A = 0.85*Nt + 0.15*m
# 初始化p0为全1数组(表示初始概率分布)
p0 = np.array([1, 1, 1])
# 定义p等于p0
p = p0
# 使用for循环迭代22次
for i in range(22):
# 计算新的状态概率分布pk,这是由A和当前的p相乘得到的
pk = A.dot(p)
# 找到最大概率的位置i
i = np.argmax(pk)
# 将pk除以其第i个元素,使得其总和为1
lam = pk[i]/p[i]
pk = pk/lam
# 更新p为新的概率分布
p = pk
# 如果两次迭代之间的差异足够小,则跳出循环(这里没有实现该条件判断)
#if np.sqrt((p-pk).dot(p-pk))<1e-10:
#break
# 输出最终的结果
print(p)
这段代码首先创建了一个名为 m 的3x3矩阵,所有元素均为1/3。然后定义了矩阵 A,它是之前定义的 Nt 矩阵和 m 矩阵的线性组合。接下来,初始化一个名为 p0 的一维数组,表示初始的状态概率分布。之后进入一个循环,在每次迭代中,计算出新的状态概率分布 pk,它是通过将 A 矩阵和当前的 p 相乘得到的。然后找到 pk 中的最大值位置 i ,并将 pk 除以其第 i 个元素,使其总和为1。最后,更新 p 为新的概率分布。
五、HITS