我写了一个简单的函数来查找随机生成的数据集的均值,方差和协方差。 但是当我将输出与Numpy函数的输出进行比较时,我得到的结果略有不同。
有人可以建议为什么会这样吗?
import random
import numpy as np
def basic_calc():
x = np.random.randn(10)
y = np.random.randn(10)
print(x, y)
print("########\n########\n Using Basic Calc: ")
mean_x = np.sum(x)
mean_x /= x.size
print("Mean of X: ", mean_x)
var = 0
for i in range (9):
var += (x[i] - mean_x)**2
variance_x = var/(x.size-1)
print("Variance of X: ", variance_x)
covar = 0
for i in range (9):
covar += (x[i] - mean_x)*(y[i] - np.mean(y))
covar_xy = covar/(y.size-1)
print("Co-Variance of XY: ", covar_xy)
print("########\n########\n Using Numpy Functions: ")
print("Mean of X: ",np.mean(x))
print("Variance of X: ", np.var(x))
print("Co-Variance of X,Y: ", np.cov(x,y
编辑:
输出:
使用Basic Calc:
Mean of X: -0.37229498827575525
Variance of X: 0.9799024073066904
Co-Variance of XY: -0.05818610994017605
使用Numpy函数:
Mean of X: -0.37229498827575525
Variance of X: 0.8916536385612055
Co-Variance of X,Y: [[ 0.99072627 -0.09117693]
[-0.09117693 0.67371543]]
对于所使用的两种方法,方差和Co方差并不完全相同。
答案 0 :(得分:1)
这是for i in range(9)
定义中的错误。更改您的代码:
for i in range(10)
为:
range(x)
结果将对齐。请记住,Route::get('/test', 'Product\MuslimController@show')->name('muslim.details');
计数从0到x-1(含),Python / Numpy索引从0开始。
答案 1 :(得分:1)
首先,您应该检查range(9)
是否真的是您想要做的,因为它将从0到8进行索引,而range(10)
将从0到9进行索引。
现在出现了方差的定义,你有一个完全集时使用的方差n,以及你有样本时使用的方差n-1。
2之间的差异是值m = sum(xi)/ n是否是实际平均值,或者它是否只是平均值的近似值。
方差n给出实数方差,用于类的高度方差(数据集已满)等情况。在这种情况下,我们使用,
sum([(xi - m) ** 2 for xi in dataset]) / len(dataset)
方差n-1只是一个近似值,并且在股票价格等情况下使用,随着更多数据集的增加,价值会变得更好。在这种情况下,我们使用,
sum([(xi - m) ** 2 for xi in dataset]) / (len(dataset) - 1)
要获得相同的结果,在numby中,您可以使用ddof
参数,默认情况下为ddof=0
。因此,对于方差n-1,您只需执行ddof=1
:
np.var(dataset, ddof=1)
和
sum([(xi - m) ** 2 for xi in dataset]) / (len(dataset) - 1)