我怎么计算标准差蟒蛇不使用顽固?

0

的问题

我试着计算标准差python没有用的 numpy 或任何外部图书馆除了 math. 我想获得更好的写作的算法和我只是这样做点"家庭作业"作为提高我蟒蛇的技能。 我的目标是把 这一公式 成python但我没有得到正确的结果。

我使用一系列的速度在哪里 speeds = [86,87,88,86,87,85,86]

当我运行:

std_dev = numpy.std(speeds)
print(std_dev)

我得:0.903507902905. 但我不希望依赖顽固. 所以...

我的执行情况如下:

import math

speeds = [86,87,88,86,87,85,86]

def get_mean(array):
    sum = 0
    for i in array:
        sum = sum + i
    mean = sum/len(array)
    return mean

def get_std_dev(array):
    # get mu
    mean = get_mean(array)
    # (x[i] - mu)**2
    for i in array:
        array = (i - mean) ** 2
        return array
    sum_sqr_diff = 0
    # get sigma
    for i in array:
        sum_sqr_diff = sum_sqr_diff + i
        return sum_sqr_diff
    # get mean of squared differences
    variance = 1/len(array)
    mean_sqr_diff = (variance * sum_sqr_diff)
    
    std_dev = math.sqrt(mean_sqr_diff)
    return std_dev

std_dev = get_std_dev(speeds)
print(std_dev)

现在,当我运行:

std_dev = get_std_dev(speeds)
print(std_dev)

我得到: [0] 但我期待0.903507902905

我是什么丢在这里?

algorithm mean python standard-deviation
2021-11-23 20:46:59
5

最好的答案

1
speeds = [86,87,88,86,87,85,86]

# Calculate the mean of the values in your list
mean_speeds = sum(speeds) / len(speeds)

# Calculate the variance of the values in your list
# This is 1/N * sum((x - mean(X))^2)
var_speeds = sum((x - mean_speeds) ** 2 for x in speeds) / len(speeds)

# Take the square root of variance to get standard deviation
sd_speeds = var_speeds ** 0.5

>>> sd_speeds
0.9035079029052513
2021-11-23 21:10:27

当我运行,我得到 1.0.
bkleeman

重新启动您的蟒蛇核心。 有些东西你已经做了有拧一个内在职能。
CJR

哦,没关系,你使用python2.7时,不您。 添加 from __future__ import division -标准分 / 不是真正的司直到蟒蛇3.0除非你从进口的未来。
CJR

是的,我用2.7. 你的解决方案,再加上未来的分的进口是现在为我工作 非常感谢你的帮助!
bkleeman

是时候搬到py3,伙计。
CJR

我漂亮的新python和我还没有想出来的谣或因为到时我的机器运行py2vs py3是诚实的。 我就必须得到解决。
bkleeman

一个很大的linux发行版的船py2.7和py3-你可能有python3(但是二进制的 python3 而不是只是 python). 你也可以考虑使用类似的蟒蛇设立的环境。 py2.7是过去终了的生活。
CJR
1

问题在于你的码的再利用的阵列,并返回中间的循环

def get_std_dev(array):
    # get mu
    mean = get_mean(array)       <-- this is 86.4
    # (x[i] - mu)**2
    for i in array:
        array = (i - mean) ** 2  <-- this is almost 0
        return array             <-- this is the value returned

现在让我们看看算法所使用。 注意,有两个标准偏差的公式,通常使用。 有各种论点作为其中一个是正确的。

sqrt(sum((x - mean)^2) / n)

sqrt(sum((x - mean)^2) / (n -1))

对于大的n值,第一个公式是,用自-1是微不足道的。 第一个公式可以降低到

sqrt(sum(x^2) /n - mean^2)

所以你将如何做到这蟒蛇?

def std_dev1(array):
   n = len(array)
   mean = sum(array) / n
   sumsq = sum(v * v for v in array)
   return (sumsq / n - mean * mean) ** 0.5
2021-11-24 06:21:59
-1

一些代码中的问题,其中之一是返回值内所为的发言。 你可以试试这个

def get_mean(array):
    return sum(array) / len(array)


def get_std_dev(array):
    n = len(array)
    mean = get_mean(array)
    squares_arr = []
    for item in array:
        squares_arr.append((item - mean) ** 2)
    return math.sqrt(sum(squares_arr) / n)
2021-11-23 22:06:23
-2

这一点。 你需要摆脱的 return 内为循环。

def get_std_dev(array):
    # get mu
    mean = get_mean(array)
    sum_sqr_diff = 0
    # get sigma
    for i in array:
        sum_sqr_diff = sum_sqr_diff + (i - mean)**2
    # get mean of squared differences
    variance = 1/len(array)
    mean_sqr_diff = (variance * sum_sqr_diff)
    
    std_dev = math.sqrt(mean_sqr_diff)
    return std_dev
2021-11-23 20:59:12
-2

如果你不想使用 numpy 它的确定给一个尝试 statistics 包在蟒蛇

import statistics

st_dev = statistics.pstdev(speeds)
print(st_dev)

或如果你仍然愿意使用一个定制的解决方案然后我建议你使用下列办法使用名单的理解,而不是复杂的越野车的方法

import math

mean = sum(speeds) / len(speeds)
var = sum((l-mean)**2 for l in speeds) / len(speeds)
st_dev = math.sqrt(var)
print(st_dev)
2021-11-23 20:58:42

其他语言

此页面有其他语言版本

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................