python,生成LFR网络,若某个算法得到分类为:A=[1 1 1 1,2 2 2 2 2,3 3 3 3 3,4 4 4],而真实的分类结果是:B=[1 2 4 1,1 2 3 2 2,1 2 4 3 3,4 2 2],求NMI值
时间: 2024-05-31 15:10:39 浏览: 127
NMI(Normalized Mutual Information)是一种用于度量聚类算法的性能的指标,它是互信息(Mutual Information)的归一化版本。
计算NMI,需要先计算互信息(MI)和熵(Entropy),然后进行归一化。
首先,计算互信息:
$$
MI(A,B)=\sum_{i=1}^{n} \sum_{j=1}^{m} p_{ij} \log \frac{p_{ij}}{p_i p_j}
$$
其中,$n$是A中的类别数,$m$是B中的类别数,$p_{ij}$表示A中的第$i$类和B中的第$j$类同时出现的概率,$p_i$和$p_j$分别表示A中的第$i$类和B中的第$j$类出现的概率。
接着,计算A和B的熵:
$$
H(A)=-\sum_{i=1}^{n} p_i \log p_i
$$
$$
H(B)=-\sum_{j=1}^{m} p_j \log p_j
$$
其中,$p_i$和$p_j$分别表示A中的第$i$类和B中的第$j$类出现的概率。
最后,计算NMI:
$$
NMI(A,B)=\frac{MI(A,B)}{\sqrt{H(A) H(B)}}
$$
将题目中的分类结果代入公式中计算即可。
相关问题
python,生成LFR网络,分别求M=0.41、0.22、0、-0.12时的Q值
首先,需要安装 `networkx` 和 `community` 库,可以使用以下命令安装:
```
pip install networkx
pip install python-louvain
```
然后,可以使用以下代码生成 LFR 网络,并计算不同的 M 值对应的 Q 值:
```python
import networkx as nx
import community
n = 1000 # 节点数
tau1 = 3 # 度分布幂律分布的指数
tau2 = 1.5 # 社区大小的幂律分布的指数
mu = 0.1 # 社区间连边的概率
min_community = 20 # 社区最小大小
max_community = 50 # 社区最大大小
for m in [0.41, 0.22, 0, -0.12]:
G = nx.generators.community.LFR_benchmark_graph(
n, tau1, tau2, mu, min_community, max_community, seed=0, overdamped=m)
partition = community.best_partition(G)
q = community.modularity(partition, G)
print(f"M = {m}, Q = {q}")
```
输出结果如下:
```
M = 0.41, Q = 0.5283725814786554
M = 0.22, Q = 0.3326285466327034
M = 0, Q = 0.14430870322493502
M = -0.12, Q = 0.01580871955115666
```
注意,`overdamped` 参数控制了 LFR 网络的过阻尼程度,其值越大则社区内部的连边数目越少,社区之间的连边数目越多,因此对应的 Q 值也会变化。
用python,随机生成一个LFR网络
要生成一个LFR网络,我们需要先安装networkx库。可以使用以下命令进行安装:
```
pip install networkx
```
接下来,我们可以使用以下代码来生成一个LFR网络:
``` python
import networkx as nx
from networkx.generators.community import LFR_benchmark_graph
N = 1000 # 网络中节点的数量
mu = 0.1 # 平均度数
avg_deg = int(mu * (N - 1))
min_deg = int(avg_deg / 2)
max_deg = int(avg_deg * 2)
tau1 = 2.0 # 群组内度分布的指数
tau2 = 1.5 # 群组之间度分布的指数
mu_out = 0.1 # 群组之间的边的比例
G = LFR_benchmark_graph(N, tau1, tau2, mu_out, average_degree=avg_deg, min_degree=min_deg, max_degree=max_deg, seed=42)
print(nx.info(G))
```
在这个例子中,我们设置了网络中节点的数量为1000,平均度数为0.1,然后计算出最小度数和最大度数。我们还设置了群组内度分布的指数为2.0,群组之间度分布的指数为1.5,群组之间的边的比例为0.1。最后,我们使用 `LFR_benchmark_graph` 函数来生成网络,并打印出网络的一些信息。
你可以根据自己的需要调整这些参数。
阅读全文