gpt4 book ai didi

python - 在Python中使用矩阵格式来计算我自己的相似度分数

转载 作者:行者123 更新时间:2023-12-01 04:41:51 26 4
gpt4 key购买 nike

我有一个 csv 文件,它是国家之间交易的商品的值(value),如下所示:

Country  Comm  Value
GER 1 200
GER 2 300
GER 45 354
USA 2 100
USA 85 500
UK 2 240
UK 85 900

我用这些数据创建了一个矩阵。在这个创建的矩阵中,行是国家,列是商品代码,每个元素显示贸易值(value)。商品数量为 97 种,我使用以下代码创建该矩阵:

rfile = open('file path','r')
rfile.next()
dic_c1_products = {}
for i in rfile :
lns = i.strip().split(',')
c1 = lns[0]
p = lns[1]
value= lns[2]
if not dic_c1_products.has_key(c1):
dic_c1_products[c1] = [(p,value),]
else:
dic_c1_products[c1].append((p,value))
product_count = 97
c1_list = dic_c1_products.keys()
matrix_c1_products = [[0 for col in range(int(product_count)+1)] for row in range(len(c1_list))]
for c1 in dic_c1_products:
for p, v in dic_c1_products[c1]:
matrix_c1_products[c1_list.index(c1)][int(p)] = int(v)
print 'Matirix Done'

现在我想计算每对国家的指数得分(这对得分是:共同贸易总额除以每个国家的贸易总额)。创建的矩阵具有如下形式:

Countries   Commodity1 Commodity2 Commodity45 Commodity85
GER 200 300 45 0
USA 0 100 0 500
UK 0 240 0 900

首先,我想将两个国家正在交易的相同商品的总值(value)相加,然后将该金额除以这两个国家的总贸易额。例如,如果我们考虑德国-美国,它们都交易商品编号 2,所以我想对这些常见商品进行求和 (300+100)德国与美国贸易总额之和:(第一行:200+300+354)+(第二行:100+500)简而言之,如果我们考虑矩阵:首先,我想计算 GER 和 USA 行的总值。其次,计算正在交易的普通商品的总值(value)第三,将第二阶段的值(value)除以第一阶段的值(value)。为此,我编写了以下代码:

for i in range(len(matrix_c1_products)):
for j in range(i, len(matrix_c1_products)):
dividend=sum([matrix_c1_products[i]])+sum([matrix_c1_products[j]])
for k in matrix_c1_products[i]:
for l in matrix_c1_products[j]:
# print k,l
if int(k)==int(0):
pass
if int(l)==int(0):
pass
else:
commonone.append(k)
commontwo.append(l)
divisor=sum(commonone)+sum(commontwo)
shares=int(divisor/dividend)
print shares, divisor, dividend

但是 commonone 列表有问题。我打算从两行中删除零并添加存在值,但由于循环,相同的数字在列表中重复,结果不正确。任何帮助将不胜感激。

最佳答案

作为一种更Pythonic的方式,您可以首先创建一个行字典,可以通过以下字典理解来完成:

hart_dict={i[0]:map(int,i[1:]) for i in spamreader}
{' USA': [0, 100, 0, 500], ' GER': [200, 300, 45, 0], ' UK': [0, 240, 0, 900]}

然后使用 itertools.combinations 创建配对:

capirs= list(combinations(next(z),2))
[(' GER', ' USA'), (' GER', ' UK'), (' USA', ' UK')]

然后计算商品总和:

row_sums=[sum(map(int,i)) for i in z]
[200, 640, 45, 1400]

最后你可以循环你的对并计算你的预期结果。

import csv
from itertools import combinations,izip

commodities=['Commodity1' ,'Commodity2', 'Commodity45' ,'Commodity85']
with open('ex.csv', 'rb') as csvfile:
spamreader = list(csv.reader(csvfile, delimiter=','))
chart_dict={i[0]:map(int,i[1:]) for i in spamreader}
z=izip(*spamreader)
capirs= list(combinations(next(z),2))
row_sums=[sum(map(int,i)) for i in z]

for i,j in capirs:
for index,com in enumerate(commodities):
print i,j,com,float(chart_dict[i][index]+chart_dict[j][index])/row_sums[index]

结果:

GER  USA Commodity1 1.0
GER USA Commodity2 0.625
GER USA Commodity45 1.0
GER USA Commodity85 0.357142857143
GER UK Commodity1 1.0
GER UK Commodity2 0.84375
GER UK Commodity45 1.0
GER UK Commodity85 0.642857142857
USA UK Commodity1 0.0
USA UK Commodity2 0.53125
USA UK Commodity45 0.0
USA UK Commodity85 1.0

关于python - 在Python中使用矩阵格式来计算我自己的相似度分数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30494062/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com