使用python语言计算特定列上的数据距离
我有data.txt,我想用python计算这些数据使用python语言计算特定列上的数据距离,python,loops,if-statement,distance,Python,Loops,If Statement,Distance,我有data.txt,我想用python计算这些数据 id,目标,序号1,序号2,序号3,序号1,序号2,序号4,序号5,序号6 1,T,高,高,高,教师,诺基亚,中,3,低 2,T,高,中,高,教师,诺基亚,中,3,低 3,F,高,中,高,farmer,三星,中,3,低 4,T,高,中,高,律师,索尼,低,1,低 5,F,高,中,高,博士,联想,低,1,低 6,T,高,高,高,警察,iphone,低,1,低 7,F,高,低,高,博士,三星,中,2,低 8,T,高,低,高,农民,索尼,低,2,低
id,目标,序号1,序号2,序号3,序号1,序号2,序号4,序号5,序号6
1,T,高,高,高,教师,诺基亚,中,3,低
2,T,高,中,高,教师,诺基亚,中,3,低
3,F,高,中,高,farmer,三星,中,3,低
4,T,高,中,高,律师,索尼,低,1,低
5,F,高,中,高,博士,联想,低,1,低
6,T,高,高,高,警察,iphone,低,1,低
7,F,高,低,高,博士,三星,中,2,低
8,T,高,低,高,农民,索尼,低,2,低
9,F,高,中,中,律师,联想,中,2,低
10,T,中,高,低,员工,诺基亚,低,1,低
根据这个数据,我想计算d(i,j)=(s-t)/s。其中s是标称的总数(根据该数据s=2),t是处于相同状态的i&j属性(例如:i为第1行,j为第2行,因此t=2)。但我只想用列nominal1和nominal2计算数据
对于t,可将其视为:
nominal1 nominal2
i a b
j c d
if a==c && b==d
t=2
if a==c || b==d
t=1
else 0
我已经尝试了一些编码,但我仍然不知道如何使列仅为读取时的nominal1和nominal2,以及如何编码s=2和t将具有如上所述的值。谁能告诉我该怎么办
这段代码是我做的
def distance(data,target_attr):
val_freq = {}
data_distance = 0.0
# Calculate the frequency of each of the values in the target attr
for record in data:
if (val_freq.has_key(record[target_attr])):
val_freq[record[target_attr]] += 1.0
else:
val_freq[record[target_attr]] = 1.0
for i in val_freq.values():
return (s-t)/s
感谢您的帮助。首先,我将实施:
def distance(list1, list2):
s = len(list1)
t = sum(map(lambda x,y: 1 if x == y else 0, list1, list2))
# note: float() is important here, or you would nearly always get zero!
return float(s-t)/s
对总和的解释(映射(λx,y:1,如果x==y,则为0,列表1,列表2)):
该方法计算两个元组的距离,其中所有属性都是标准值。如果要减少属性,可以使用:
distance(list1[3:5], list2[3:5]) # take just list[3] and list[4] in consideration
简短说明:以下是一个错误:
if a==c && b==d
t=2
if a==c || b==d
t=1
else 0
你的意思是:
if a==c && b==d
t=2
elif a==c || b==d
t=1
else 0
elif
在这里很重要,因为否则t==1
也适用于a==c&&b==d
如果我使用这个t=sum(map(lambda x,y:1如果x==y,其他0,列表1列表2))。t的值为1或0。因此,如果数据的结果值为t=2,则不能使用该代码。我说的对吗?最后别忘了总数!查看我问题的最后一次编辑(注意:我输入了一个错误,忘记了list1
和list2
之间有一个逗号–我现在更正了它)我以前有1000行的数据。因此,如果我使用函数来说明如何包含它。是这样的:因为我在范围内(list1:t=sum(map(lambda x,y:1如果x==y,则为0,list1[i],list2[i]))不,您的代码也将无法工作map
希望其第二个和第三个参数具有iterables。。。你明白了吗,我发布的代码是如何工作的?
if a==c && b==d
t=2
elif a==c || b==d
t=1
else 0