有没有比这更好的方法来计算两个列表的协方差?
Is there any better way to calculate the covariance of two lists than this?
我有两个列表,一个由 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)
如果不想使用外部模块,可以这样处理:
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
您可以使用理解、zip 和多变量赋值优雅地完成这些事情:
sum((x - x_mean)*(y - y_mean) for x, y in zip(x_coordinates, y_coordinates)) / len(x_coordinates)
我有两个列表,一个由 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)
如果不想使用外部模块,可以这样处理:
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
您可以使用理解、zip 和多变量赋值优雅地完成这些事情:
sum((x - x_mean)*(y - y_mean) for x, y in zip(x_coordinates, y_coordinates)) / len(x_coordinates)