如何制作网络图归一化数据
How to make network graph normalised data
我是这个时代的新人。我有演员和电影的数据。
我正在尝试进行网络分析并寻找社区。所以我拿我的数据,用它的转置进行矩阵乘法并将它归一化。
现在我想让它成为网络图。我尝试使用 networkx 库,但无法成功。我没有任何经验,所以我愿意接受所有建议。
您可以使用 NetworkX 映射此网络,希望我能在这部分提供帮助!
首先,您需要导入 NetworkX 库(使用 import networkx as nx
)。
接下来,导入数据。由于您的数据采用 矩阵格式 (而不是简单的边列表),因此导入到 NetworkX 中会稍微复杂一些。我建议首先将数据转换为 NumPy 矩阵,然后使用 NetworkX from_numpy_matrix
函数创建图形。
我将 运行 通过使用虚拟数据的示例。该数据截图可见:here (a simplified version of your normalised dataset)
这是我用来导入数据和创建图表的代码:
import numpy as np
import pandas as pd
import networkx as nx
df=pd.read_csv('matrixdata.csv', sep=',', index_col=0) # read data
matrix = np.asmatrix(df.values) # convert data to NumPy matrix
G = nx.from_numpy_matrix(matrix) # create graph in networkx
现在我可以使用 print(len(G.edges())
打印网络中的边数,其中 returns 5 条边(因为我制作了一个只有 5 个连接的 5x5 矩阵)。
从这里,我们可以对网络进行一些测量(例如密度、度等)。
但是,如上图所示,请注意您的数据。在规范化版本中,所有节点 ID 都已从电影(行)和演员(列)更改为标准整数(列和行均从 0 开始)。 NetworkX 会将这些视为您的节点 ID,这意味着它会认为第一列中的节点 0 与第一行中的节点 0 相同 。这可能是您的意图,因为您已经对数据进行了规范化,但值得一提。这样做的后果是您的连接都将被视为 'self-directed',即节点 0 仅连接到节点 0,节点 1 仅连接到节点 1,依此类推。
还值得注意的是,您的单元格中的标准化值将被 NetworkX 视为 edge/tie 的权重,因为它们不仅仅反映二元关系(其中 1 代表连接和 0 表示没有连接。因此,NetworkX 将创建一个 加权图而不是二进制 图(尽管有一些方法可以删除权重并转换为简单的二进制图)。在在我的示例中,我还添加了权重(全部为 0.5)而不是二进制连接来演示会发生什么。如果我为我创建的网络打印边缘属性数据,您将看到权重已自动添加:
print(G.edges(data=True) #edges=True parameter shows all edge attributes
Returns:
[(0, 0, {'weight': 0.5}), (1, 1, {'weight': 0.5}), (2, 2, {'weight': 0.5}), (3, 3, {'weight': 0.5}), (4, 4, {'weight': 0.5})]
无论如何,希望这至少有助于在 NetworkX 中创建图表!
我是这个时代的新人。我有演员和电影的数据。
我正在尝试进行网络分析并寻找社区。所以我拿我的数据,用它的转置进行矩阵乘法并将它归一化。
您可以使用 NetworkX 映射此网络,希望我能在这部分提供帮助!
首先,您需要导入 NetworkX 库(使用 import networkx as nx
)。
接下来,导入数据。由于您的数据采用 矩阵格式 (而不是简单的边列表),因此导入到 NetworkX 中会稍微复杂一些。我建议首先将数据转换为 NumPy 矩阵,然后使用 NetworkX from_numpy_matrix
函数创建图形。
我将 运行 通过使用虚拟数据的示例。该数据截图可见:here (a simplified version of your normalised dataset)
这是我用来导入数据和创建图表的代码:
import numpy as np
import pandas as pd
import networkx as nx
df=pd.read_csv('matrixdata.csv', sep=',', index_col=0) # read data
matrix = np.asmatrix(df.values) # convert data to NumPy matrix
G = nx.from_numpy_matrix(matrix) # create graph in networkx
现在我可以使用 print(len(G.edges())
打印网络中的边数,其中 returns 5 条边(因为我制作了一个只有 5 个连接的 5x5 矩阵)。
从这里,我们可以对网络进行一些测量(例如密度、度等)。
但是,如上图所示,请注意您的数据。在规范化版本中,所有节点 ID 都已从电影(行)和演员(列)更改为标准整数(列和行均从 0 开始)。 NetworkX 会将这些视为您的节点 ID,这意味着它会认为第一列中的节点 0 与第一行中的节点 0 相同 。这可能是您的意图,因为您已经对数据进行了规范化,但值得一提。这样做的后果是您的连接都将被视为 'self-directed',即节点 0 仅连接到节点 0,节点 1 仅连接到节点 1,依此类推。
还值得注意的是,您的单元格中的标准化值将被 NetworkX 视为 edge/tie 的权重,因为它们不仅仅反映二元关系(其中 1 代表连接和 0 表示没有连接。因此,NetworkX 将创建一个 加权图而不是二进制 图(尽管有一些方法可以删除权重并转换为简单的二进制图)。在在我的示例中,我还添加了权重(全部为 0.5)而不是二进制连接来演示会发生什么。如果我为我创建的网络打印边缘属性数据,您将看到权重已自动添加:
print(G.edges(data=True) #edges=True parameter shows all edge attributes
Returns:
[(0, 0, {'weight': 0.5}), (1, 1, {'weight': 0.5}), (2, 2, {'weight': 0.5}), (3, 3, {'weight': 0.5}), (4, 4, {'weight': 0.5})]
无论如何,希望这至少有助于在 NetworkX 中创建图表!