gpt4 book ai didi

python - Scikit Learn 的规范化互信息给了我错误的值(value)

转载 作者:太空狗 更新时间:2023-10-30 02:44:16 26 4
gpt4 key购买 nike

我是 Python 的新手,我正在尝试查看 2 个不同信号之间的归一化互信息,无论我使用什么信号,我获得的结果始终是 1,我认为这是不可能的,因为信号是不同且不完全相关。

我正在使用 Normalized Mutual Information Function provided Scikit Learn : sklearn.metrics.normalized mutualinfo_score(labels_true, labels_pred).

这是我使用的代码:

from numpy.random import randn
from numpy import *
from matplotlib.pyplot import *
from sklearn.metrics.cluster import normalized_mutual_info_score as mi
import pandas as pd

def fzX(X):
''' z-scoring columns'''
if len(X.shape)>1:
'''X is matrix ... more vars'''
meanX=mean(X,0)
stdX=std(X,0)
stdX[stdX<1e-9]=0
zX=zeros(X.shape)
for i in range(X.shape[1]):
if stdX[i]>0:
zX[:,i]=(X[:,i]-meanX[i])/stdX[i]
else:
zX[:,i]=0
else:
'''X is vector ... more vars'''
meanX=mean(X)
stdX=std(X,0)
zX=(X-meanX)/stdX
return(zX,meanX,stdX)

def fMI(X):
'''vars in columns,
returns mut info of normalized data'''
zX,meanX,stdX=fzX(X)
n=X.shape[1]
Mut_Info=zeros((n,n))
for i in range(n):
for j in range(i,n):
Mut_Info[i,j]=mi(zX[:,i],zX[:,j])
Mut_Info[j,i]=Mut_Info[i,j]
plot(zX);show()
return(Mut_Info)

t=arange(0,100,0.1) # t=0:0.1:99.9
N=len(t) # number of samples in t
u=sin(2*pi*t)+(randn(N)*2)**2
y=(cos(2*pi*t-2))**2+randn(N)*2

X=zeros((len(u),2))
X[:,0]=u
X[:,1]=y

mut=fMI(X)
print mut

plot(X)
show()

有没有人遇到过类似的问题?你知道我做错了什么吗?

非常感谢您抽出宝贵的时间。

最佳答案

您的 float 据不能以这种方式使用 -- normalized_mutual_info_score 集群上定义。该函数将把每个浮点值解释为一个不同的簇。如果您回顾一下文档,您会发现该函数会抛出有关簇标签的信息。毕竟,标签本身是任意的,因此反相关标签与相关标签具有同样多的互信息。

示例

这里有几个直接基于文档的示例:

>>> normalized_mutual_info_score([1, 1, 0, 0], [1, 1, 0, 0])
1.0
>>> normalized_mutual_info_score([1, 1, 0, 0], [0, 0, 1, 1])
1.0

看看标签在第一种情况下如何完全相关,而在第二种情况下如何完全反相关?但在这两种情况下,互信息都是 1.0 .对于部分相关的值,同样的模式继续存在:

>>> normalized_mutual_info_score([1, 1, 0, 0], [1, 0, 1, 1])
0.34559202994421129
>>> normalized_mutual_info_score([1, 1, 0, 0], [0, 1, 0, 0])
0.34559202994421129

仅在第二个序列中交换标签没有效果。同样,这次使用浮点值:

>>> normalized_mutual_info_score([0.1, 0.1, 0.5, 0.5], [0.1, 0.1, 0.1, 0.5])
0.34559202994421129
>>> normalized_mutual_info_score([0.1, 0.1, 0.5, 0.5], [0.5, 0.5, 0.5, 0.1])
0.34559202994421129

所以在看到所有这些之后,这似乎并不令人惊讶:

>>> normalized_mutual_info_score([0.1, 0.2, 0.3, 0.4], [0.5, 0.6, 0.7, 0.8])
1.0

每个 float 都被认为是它自己的标签,但标签本身是任意的。所以该函数无法区分两个标签序列之间的任何区别,并返回 1.0 .

处理 float 据

如果您从 float 据开始,并且需要进行此计算,您可能想要分配 聚类标签,可能是使用两种不同的方案将点放入 bin 中。

例如,在第一个方案中,您可以将每个值都放在 p <= 0.5在集群中 0p > 0.5在集群中 1 .然后,在第二个方案中,你可以把每个值 p <= 0.4在集群中 0p > 0.4在集群中 1 .这些聚类大部分会重叠;他们没有的点会导致互信息得分下降。

还有其他可能的聚类方案——我不太确定你的目标是什么,所以我不能给出比这更具体的建议。

关于python - Scikit Learn 的规范化互信息给了我错误的值(value),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30197386/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com