python – Scikit的规范化互信息学习给了我错误的价值
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了python – Scikit的规范化互信息学习给了我错误的价值,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2897字,纯文字阅读大概需要5分钟。
内容图文
![python – Scikit的规范化互信息学习给了我错误的价值](/upload/InfoBanner/zyjiaocheng/809/9d7f77142b9c4d568925e68b66b23d10.jpg)
我是Python的新手,我试图看到两个不同信号之间的归一化互信息,无论我使用什么信号,我得到的结果总是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()
你们中有谁有过类似的问题吗?你知道我做错了什么吗?
非常感谢您的专注时间.
解决方法:
您的浮点数据不能以这种方式使用 – 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
每个浮点都被视为自己的标签,但标签本身是任意的.因此该函数无法区分两个标签序列之间的任何差异,并返回1.0.
使用浮点数据
如果您开始使用浮点数据,并且需要进行此计算,则可能需要分配群集标签,可能是通过使用两种不同的方案将点放入bin中.
例如,在第一种方案中,您可以将每个值p <= 0.5放在簇0中,并且p> 1.然后,在第二种方案中,您可以将每个值p <= 0.4置于簇0中,并且p> 1.簇1中的0.4.这些聚类大多会重叠;他们没有的点会导致互信息得分下降. 还有其他可能的聚类方案 – 我不太确定你的目标是什么,所以我不能给出更具体的建议.
内容总结
以上是互联网集市为您收集整理的python – Scikit的规范化互信息学习给了我错误的价值全部内容,希望文章能够帮你解决python – Scikit的规范化互信息学习给了我错误的价值所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。