Scikit标准化互信息学习给我错误的值

2024-04-19 03:16:21 发布

您现在位置:Python中文网/ 问答频道 /正文

我是Python新手,我试图看到两个不同信号之间的标准化互信息,不管我使用什么信号,我得到的结果总是1,我认为这是不可能的,因为信号是不同的,不是完全相关的。

我使用的是Normalized Mutual Information Function provided Scikit Learn:sklearn.metrics.normalized mutanalinfo评分(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()

你们以前有过类似的问题吗?你知道我做错了什么吗?

非常感谢您的奉献。


Tags: infromimportinfolen信号zerosvars
1条回答
网友
1楼 · 发布于 2024-04-19 03:16:21

浮点数据不能这样使用-^{}是在集群上定义的。函数将把每个浮点值解释为一个不同的集群。如果你回顾一下文档,你会发现函数抛出了关于集群标签的信息。毕竟,标签本身是任意的,所以反相关标签和相关标签具有同样多的相互信息。

示例

以下是一些直接基于文档的示例:

>>> 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

每个浮点都被视为自己的标签,但标签本身是任意的。因此,函数无法区分两个标签序列之间的任何差异,并返回1.0

使用浮点数据

如果您从浮点数据开始,并且您需要执行此计算,那么您可能希望分配群集标签,可能需要使用两种不同的方案将点放入存储箱。

例如,在第一个方案中,可以将每个值p <= 0.5放入集群0,将p > 0.5放入集群1。然后,在第二种方案中,可以将每个值p <= 0.4放入集群0,将p > 0.4放入集群1。这些组合大多会重叠;没有重叠的点会导致相互信息得分下降。

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

相关问题 更多 >