定义函数以返回样本协方差。

4

我有两个向量,想在一个函数中使用它们并返回样本协方差。有人能帮我修复我的程序吗?我是Python和编程的新手。

xv= array([8., 9.5, 7.8, 4.2, -7.7, -5.4, 3.2])
yv= array([8.9, 2.0, 4.8, -4.2, 2.7, -3.4, -5.9])

def cov(x,y):
    if (len(x) != len(y)
        [Stop] 
        x.bar = mean(x) 
        y.bar = mean(y) 
        N = len(x)      
    Cov = (sum((x-x.bar)*(y-y.bar))) / (N-1.0) 
    return(Cov) 

5
你对现有代码具体有什么问题? - Anton Beloglazov
从 x.bar = mean(y) 开始...我收到了无效语法消息。不确定为什么? - Bill
1
x.bar不是一个合适的变量名;不要在变量名中使用'.';你应该使用x_bar或xbar。 - Akavall
3个回答

1

这是我的版本,没有使用外部库。协方差的方程式来自维基百科:http://en.wikipedia.org/wiki/Covariance

x = [8., 9.5, 7.8, 4.2, -7.7, -5.4, 3.2]
y = [8.9, 2.0, 4.8, -4.2, 2.7, -3.4, -5.9]

def mean(x):
    return sum(x) / len(x)

def cov(x, y):
    x_mean = mean(x)
    y_mean = mean(y)
    data = [(x[i] - x_mean) * (y[i] - y_mean)
            for i in range(len(x))]
    return sum(data) / (len(data) - 1)

print cov(x, y)

谢谢您的帮助,这个程序已经正确运行了。但是我只是在寻找样本协方差。我相信它是从返回的矩阵中得出的12.495。这是因为我们的公式不同吗? - Bill
你期望返回一个矩阵吗?由于只有两个变量,返回的值是它们之间的协方差。 - Anton Beloglazov
我期望只返回一个数字。只是样本协方差。 - Bill
当前函数确实返回一个数字。那么问题是什么? - Anton Beloglazov
没事,我刚才有点困惑,但现在不了。非常感谢你的帮助。谢谢。 - Bill

0

我重写了你的函数,现在它可以正常工作:

def cov(x,y):
    if (len(x) != len(y)):
        sys.exit()
    x_bar = float(sum(x)/len(x))
    y_bar = float(sum(y)/len(y))
    N = len(x)
    sum_xy = 0
    for i in range(len(x)):
        sum_xy += (x[i]-x_bar)*(y[i]-y_bar)
    return(sum_xy/(N-1.0))

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接