1

Pythonで数値の標準偏差を見つけようとしています。これは入門レベルのプログラミング クラスなので、まだ導入されていない関数を使用することは避けています。

このプログラムを使用すると、リストに数値を追加し、そのリストを分析してから、平均、最小、最大、STDev などを引き出すことができます。STDev 以外のすべてを正常に表示できました。取得し続けるエラーは float object not iterable です。関連部分のコードは次のとおりです。

elif (menuchoice == 4):
        sum = 0.0
        print("std deviation")
        stdev = 0.0
        for i in range(listcount):
            scorenum4 = eval(scorenum[i])
            scoreaverage2 += scorenum4
        scoreaverage2 /= listcount
        for i in range(listcount):
            stdev = []
            scorenum3 = eval(scorenum[i])
            stdev += (scorenum3 - scoreaverage2)**2
            dev = sqrt((stdev)/listcount-1)
        print(dev)

どんな助けでもいいです、ありがとう。

-自己編集 - for ループから stdev=[] を削除したところです。なぜそこにあったのかわかりません - 今答えを得ていますが、数学的にはオフです

  • dev = sqrt((stdev)/listcount) に変更すると、数学エラーが修正され、DSM もこの修正を確認しました。ありがとうございました
  • プログラムは正常に機能しています。ウート。皆さんアドバイスありがとうございます。
4

4 に答える 4

5

これは、標準偏差を計算するための非常に長い方法です。これはよりPython的な方法であり、私はあえてそれもより読みやすいと言います。

mean = sum(scorenum, 0.0) / len(scorenum)
d = [ (i - mean) ** 2 for i in scorenum]
std_dev = math.sqrt(sum(d) / len(d))
于 2012-10-05T14:43:34.247 に答える
0

まず、を削除しstdev = []ます。これは意味がありません(編集によると、すでにこれを行っていますが、コードにはまだ含まれています)。

次に、行dev = sqrt(stdev/(listcount-1))をforループの外に移動します(インデントのレベルを下げます)。これは、条件が追加された後に1回だけ実行する必要があります。編集: @DSMで指摘されているように、括弧も修正します。

于 2012-10-05T14:42:40.283 に答える
0

コードの数学的エラーは次のとおりです。

        dev = sqrt((stdev)/listcount-1)

dofの好みに応じて、dev = sqrt(stdev/listcount)またはのいずれかが必要です。dev = sqrt(stdev/(listcount-1))これを修正した後、(変更された)コードは機能しているようです。

于 2012-10-05T14:49:54.703 に答える
0

別の答えは、よりパイソン的なやり方を提案していますが、ここで修正を提案します。これはそれほど効率的ではありませんが、古典的なアルゴリズムは初心者にとってより理解しやすいものです。

スコアナムは、必要なデータとSTDを格納する配列です。

import math
average=0.0
for ii in scorenum: # iterate the data array, it can contain float
    sum+=ii
average/=float(len(scorenum)) # number of data=array length

# now, compute an estimator of std=sqrt(variance/n), where variance=sum((xi-xavg)**2)
std=0.0
for ii in scorenum:
    std+=(ii-average)**2
std=math.sqrt(std/float(len(scorenum))) # if you prefer n-1: std/float(len(scorenum)-1)

print "average=",average," std=",std

コメント:-任意の種類の配列を繰り返すことができます-数学ライブラリをインポートする必要があります-+=や/=のような演算子は空想のためにここにあります。これらは、sum = sum + ii、average = average/...と同等です。

于 2012-10-05T14:50:38.467 に答える