有没有比这更好的方法来计算两个列表的协方差?

时间:2017-03-08 11:26:47

标签: python math covariance

我有两个列表,其中一个由x坐标组成,另一个由y坐标组成。

x_coordinates = [1, 2, 3, 4, 5]
y_coordinates = [1, 2, 3, 4, 5]

例如,point 1(1,1)

我想计算两个列表的协方差,并且我编写了一个代码,但我认为它有点不必要地长而且混乱。 我知道我可以使用math.cov来计算这个,但我想知道是否有可能对它进行整齐编程,可能使用map和lambda函数。

公式如下:

(x1 - average_x)*(y1 - average_y) + ... + (xn - average_x)*(yn - average_y) / (the number of the items in one of the lists)

代码:

import math

x_coordinates = [1, 2, 3, 4, 5]
y_coordinates = [1, 2, 3, 4, 5]
covariance_temp_sum = 0

x_mean = math.fsum(x_coordinates) / len(x_coordinates)
y_mean = math.fsum(y_coordinates) / len(y_coordinates)

for n in range(len(x_coordinates)):
    covariance_temp_sum += (x_coordinates[n] - x_mean) * (y_coordinates[n] - y_mean)

covariance = covariance_temp_sum / len(x_coordinates)

2 个答案:

答案 0 :(得分:4)

如果您不想使用外部模块,可以这样处理:

x = [1, 2, 3, 4, 5]
y = [1, 2, 3, 4, 5]
mean_x = sum(x) / len(x)
mean_y = sum(y) / len(y)

sum((a - mean_x) * (b - mean_y) for (a,b) in zip(x,y)) / len(x)

输出:2

答案 1 :(得分:1)

您可以使用理解,zip和多个变量赋值优雅地完成这些工作:

sum((x - x_mean)*(y - y_mean) for x, y in zip(x_coordinates, y_coordinates)) / len(x_coordinates)