这个函数来自"编程集体智慧"一书,并且应该计算p1和p2的Pearson相关系数,它应该是介于-1和1之间的数字.
如果两个评论家对项目的评价非常相似,那么函数应该返回1,或接近1.
有了真实的用户数据,我有时会得到奇怪的结果.在以下示例中,数据集critics2应返回1 - 而不是返回0.
有没有人发现错误?
(这不是"编程集体智慧"中这个python函数有什么问题的重复)
from __future__ import division
from math import sqrt
def sim_pearson(prefs,p1,p2):
si={}
for item in prefs[p1]:
if item in prefs[p2]: si[item]=1
if len(si)==0: return 0
n=len(si)
sum1=sum([prefs[p1][it] for it in si])
sum2=sum([prefs[p2][it] for it in si])
sum1Sq=sum([pow(prefs[p1][it],2) for it in si])
sum2Sq=sum([pow(prefs[p2][it],2) for it in si])
pSum=sum([prefs[p1][it]*prefs[p2][it] for it in si])
num=pSum-(sum1*sum2/n)
den=sqrt((sum1Sq-pow(sum1,2)/n)*(sum2Sq-pow(sum2,2)/n))
if den==0: return 0
r=num/den
return r
critics = {
'user1':{
'item1': 3,
'item2': 5,
'item3': 5, …Run Code Online (Sandbox Code Playgroud) 虽然它们非常相似,但我确信皮尔逊相关相似度和调整余弦相似度之间存在一些差异,因为所有论文和网页都将它们分为两种不同的类型。
然而,他们都没有提供明确的定义。这是其中一页。
谁能说出其中的区别吗?
谢谢
我正在尝试获取R中变量之间的Pearson相关系数。这是变量的散点图:
ggplot(results_summary, aes(x =D_in, y = D_ex)) + geom_point(col=ifelse(results_summary$FDR < 0.05, ifelse(results_summary$logF>0, "red", "green" ), "black"))
Run Code Online (Sandbox Code Playgroud)
如您所见,变量之间的相关性很好,因此我期望相关系数很高。但是,当我尝试获得Pearson相关系数时,我得到的是NaN!
> cor(results_summary$D_in, results_summary$D_ex, method="spearman")
[1] 0.868079
> cor(results_summary$D_in, results_summary$D_ex, method="kendall")
[1] 0.6973086
> cor(results_summary$D_in, results_summary$D_ex, method="pearson")
[1] NaN
Run Code Online (Sandbox Code Playgroud)
我检查了我的数据是否包含任何NaN:
> nrow(subset(results_summary, is.nan(results_summary$D_ex)==TRUE))
[1] 0
> nrow(subset(results_summary, is.nan(results_summary$D_in)==TRUE))
[1] 0
> cor(results_summary$D_in, results_summary$D_ex, method="pearson", use="complete.obs")
[1] NaN
Run Code Online (Sandbox Code Playgroud)
但是似乎这不是产生NaN的原因。有人可以提供任何有关这里可能发生的情况的线索吗?
谢谢你的时间!
这是有问题的功能.它计算p1和p2的Pearson相关系数,它应该是介于-1和1之间的数字.
当我将它与真实用户数据一起使用时,它有时会返回一个大于1的数字,如下例所示:
def sim_pearson(prefs,p1,p2):
si={}
for item in prefs[p1]:
if item in prefs[p2]: si[item]=1
if len(si)==0: return 0
n=len(si)
sum1=sum([prefs[p1][it] for it in si])
sum2=sum([prefs[p2][it] for it in si])
sum1Sq=sum([pow(prefs[p1][it],2) for it in si])
sum2Sq=sum([pow(prefs[p2][it],2) for it in si])
pSum=sum([prefs[p1][it]*prefs[p2][it] for it in si])
num=pSum-(sum1*sum2/n)
den=sqrt((sum1Sq-pow(sum1,2)/n)*(sum2Sq-pow(sum2,2)/n))
if den==0: return 0
r=num/den
return r
critics = {
'user1':{
'item1': 3,
'item2': 5,
'item3': 5,
},
'user2':{
'item1': 4,
'item2': 5,
'item3': 5,
}
}
print sim_pearson(critics, 'user1', 'user2', )
1.15470053838
Run Code Online (Sandbox Code Playgroud) 我在区间[0,1]中有2个45个值的系列.第一个系列是人工生成的标准,第二个系列是计算机生成的(完整系列在这里http://www.copypastecode.com/74844/).第一个系列逐渐排序.
0.909090909 0.216196598
0.909090909 0.111282099
0.9 0.021432587
0.9 0.033901106
...
0.1 0.003099256
0 0.001084533
0 0.008882249
0 0.006501463
Run Code Online (Sandbox Code Playgroud)
现在我要评估的是第二个系列中订单保留的程度,因为第一个系列是单调的.该Pearson相关是0.454763067,但我认为我们之间的关系不是线性的,所以这个值是难以解释.
一种自然的方法是使用Spearman等级相关,在这种情况下是0.670556181.我注意到随机值,当Pearson非常接近0时,Spearman等级相关性上升到0.5,所以0.67的值似乎非常低.
您将使用什么来评估这两个系列之间的顺序相似性?
我正在使用Mahout和Pearson Correlation算法根据他们对几个项目的偏好来比较和查找类似的用户.我遇到的问题是Mahout和/或Pearson忽略了为每个项目选择相同偏好的用户.有没有人知道是否有办法配置Mahout,不要忽略为每个项目选择相同偏好值的人.
我有一个捐赠和捐赠者姓名的数据框.
**donation** **Donor**
25.00 Steve Smith
20.00 Jack Johnson
50.00 Mary Jackson
... ...
Run Code Online (Sandbox Code Playgroud)
我正在尝试使用该pvclust包进行一些聚类.不幸的是,包似乎没有采用非数字数据.
> rs1.pv1 <- parPvclust(cl, rs1, nboot=10)
Error in cor(x, method = "pearson", use = use.cor) : 'x' must be numeric
Run Code Online (Sandbox Code Playgroud)
我有两个问题.
1)是否有其他包装或方法可以做得更好?
2)有没有办法"规范化"捐赠者名单?即获得唯一的捐赠者名称列表,为每个捐赠者名称分配一个ID号,然后将ID号插入数据框中代替字符名称.
当您的数据采用观察列表的形式时,是否可以计算R中的平方?我的意思是,如果你知道十字架,就很容易得到平方.例如,如果您有一项调查,并且您要求性别和一个真假问题,那么您只需要四个数字来计算卡方.我所拥有的是两列数据,每个受访者的答案.是否有可能从这个数据结构中得到平方,或者我必须转换它?
如果我必须将它转换为R,有没有人知道另一种语言可以让我直接得到chi平方?
cor()如果向量中存在极大数字并且仅返回零,则函数无法计算相关值:
foo <- c(1e154, 1, 0)
bar <- c(0, 1, 2)
cor(foo, bar)
# -0.8660254
foo <- c(1e155, 1, 0)
cor(foo, bar)
# 0
Run Code Online (Sandbox Code Playgroud)
虽然1e155非常大,但它比R可以处理的最大数量小得多.令我惊讶的是,为什么R返回错误的值并且没有返回更合适的结果,如NA或Inf.
有什么理由吗?如何确保我们的计划不会遇到这种情况?
我想对一组10个数据点执行ak均值聚类分析,每个数据点都具有与之关联的4个数值数组。我正在使用Pearson相关系数作为距离度量。我完成了k均值聚类算法的前两个步骤:
1)选择一组k个聚类的初始中心。[我随机选择了两个初始中心]
2)将每个对象分配给具有最近中心的聚类。[我使用Pearson相关系数作为距离度量标准-见下文]
现在,我需要帮助来了解算法的第三步:
3)计算集群的新中心:

其中,在这种情况下,X是4维向量,n是群集中数据点的数量。
对于以下数据,我将如何计算C(S)?
# Cluster 1
A 10 15 20 25 # randomly chosen centre
B 21 33 21 23
C 43 14 23 23
D 37 45 43 49
E 40 43 32 32
# Cluster 2
F 100 102 143 212 #random chosen centre
G 303 213 212 302
H 102 329 203 212
I 32 201 430 48
J 60 99 87 34
Run Code Online (Sandbox Code Playgroud)
k均值算法的最后一步是重复步骤2和3,直到没有任何对象改变簇为止,这非常简单。
我需要有关步骤3的帮助。计算群集的新中心。如果有人可以讲解并解释如何计算仅一个集群的新中心,那将对我有极大的帮助。
pearson ×10
r ×4
algorithm ×3
statistics ×3
correlation ×2
python ×2
analysis ×1
bignum ×1
chi-squared ×1
data-mining ×1
k-means ×1
mahout ×1
pvclust ×1
similarity ×1