我是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()
你们以前有过类似的问题吗?你知道我做错了什么吗?
非常感谢您的奉献。
浮点数据不能这样使用-^{} 是在集群上定义的。函数将把每个浮点值解释为一个不同的集群。如果你回顾一下文档,你会发现函数抛出了关于集群标签的信息。毕竟,标签本身是任意的,所以反相关标签和相关标签具有同样多的相互信息。
示例
以下是一些直接基于文档的示例:
看看标签在第一种情况下是如何完全相关的,而在第二种情况下是如何完全反相关的?但在这两种情况下,相互信息都是
1.0
。对于部分相关的值,相同的模式将继续:仅仅在第二个序列中交换标签没有效果。再说一次,这次使用浮点值:
所以看到这些,这似乎并不奇怪:
每个浮点都被视为自己的标签,但标签本身是任意的。因此,函数无法区分两个标签序列之间的任何差异,并返回
1.0
。使用浮点数据
如果您从浮点数据开始,并且您需要执行此计算,那么您可能希望分配群集标签,可能需要使用两种不同的方案将点放入存储箱。
例如,在第一个方案中,可以将每个值
p <= 0.5
放入集群0
,将p > 0.5
放入集群1
。然后,在第二种方案中,可以将每个值p <= 0.4
放入集群0
,将p > 0.4
放入集群1
。这些组合大多会重叠;没有重叠的点会导致相互信息得分下降。还有其他可能的集群方案——我不太确定您的目标是什么,所以我不能给出比这更具体的建议。
相关问题 更多 >
编程相关推荐