使用高斯分布的方差 Python
Variance using Gaussian distribution Python
我有一个代码可以使用 python 中的高斯分布计算数字的平方。现在我的任务是计算相同的方差。但是当我尝试时,我不断出错。代码如下:
import random
def generate_data(size):
n = 5
m =0.5
mu, sigma = n ** 2, m/3
return [random.gauss(mu, sigma) for _ in range(size)]
def average(ls):
avg = sum(ls) / len(ls)
variance = (sum(ls) - sum(avg)) ** 2 / len(ls)
return variance
我不太擅长统计,所以我的公式也可能有误。我也是 python.The 的初学者,我得到的错误是
'float' object is not iterable
除非你真的想或必须自己做,否则我会使用 numpy
。
http://docs.scipy.org/doc/numpy/reference/generated/numpy.var.html
http://docs.scipy.org/doc/numpy/reference/generated/numpy.random.normal.html
你的方差公式应该是
variance = sum(map(lambda x: (x-avg) ** 2, ls)) / len(ls)
因为 variance = sigma^2
您可以通过打印 math.sqrt(variance)
来测试您的代码
import random, math
def generate_data(size):
n = 5
m = 0.5
mu, sigma = n ** 2, m/3
return [random.gauss(mu, sigma) for _ in range(size)]
def variance(ls):
avg = sum(ls) / len(ls)
variance = sum(map(lambda x: (x-avg) ** 2, ls)) / len(ls)
return variance
print(0.5/3) #0.16666666666666666
print(math.sqrt(variance(generate_data(100)))) #0.15702629417476763
print(math.sqrt(variance(generate_data(1000)))) #0.16248850600497303
print(math.sqrt(variance(generate_data(10000)))) #0.16774494705918871
您可能会发现一次性计算均值、方差可能比 3 遍方法(sum + map + sum)更快
def average(ls):
sum = 0.0
sum2 = 0.0
for v in ls:
sum += v
sum2 += v*v
mean = sum / len(ls)
var = sum2/len(ls) - mean*mean
return (mean, var)
我有一个代码可以使用 python 中的高斯分布计算数字的平方。现在我的任务是计算相同的方差。但是当我尝试时,我不断出错。代码如下:
import random
def generate_data(size):
n = 5
m =0.5
mu, sigma = n ** 2, m/3
return [random.gauss(mu, sigma) for _ in range(size)]
def average(ls):
avg = sum(ls) / len(ls)
variance = (sum(ls) - sum(avg)) ** 2 / len(ls)
return variance
我不太擅长统计,所以我的公式也可能有误。我也是 python.The 的初学者,我得到的错误是
'float' object is not iterable
除非你真的想或必须自己做,否则我会使用 numpy
。
http://docs.scipy.org/doc/numpy/reference/generated/numpy.var.html
http://docs.scipy.org/doc/numpy/reference/generated/numpy.random.normal.html
你的方差公式应该是
variance = sum(map(lambda x: (x-avg) ** 2, ls)) / len(ls)
因为 variance = sigma^2
您可以通过打印 math.sqrt(variance)
import random, math
def generate_data(size):
n = 5
m = 0.5
mu, sigma = n ** 2, m/3
return [random.gauss(mu, sigma) for _ in range(size)]
def variance(ls):
avg = sum(ls) / len(ls)
variance = sum(map(lambda x: (x-avg) ** 2, ls)) / len(ls)
return variance
print(0.5/3) #0.16666666666666666
print(math.sqrt(variance(generate_data(100)))) #0.15702629417476763
print(math.sqrt(variance(generate_data(1000)))) #0.16248850600497303
print(math.sqrt(variance(generate_data(10000)))) #0.16774494705918871
您可能会发现一次性计算均值、方差可能比 3 遍方法(sum + map + sum)更快
def average(ls):
sum = 0.0
sum2 = 0.0
for v in ls:
sum += v
sum2 += v*v
mean = sum / len(ls)
var = sum2/len(ls) - mean*mean
return (mean, var)