web-dev-qa-db-ja.com

Python:定義された数のリストの分散

定義された数のリストの分散を出力する関数を作成しようとしています:

grades = [100, 100, 90, 40, 80, 100, 85, 70, 90, 65, 90, 85, 50.5]

これまでのところ、私はこれらの3つの機能を作成することを試みました:

def grades_sum(my_list):
    total = 0
    for grade in my_list: 
        total += grade
    return total

def grades_average(my_list):
    sum_of_grades = grades_sum(my_list)
    average = sum_of_grades / len(my_list)
    return average

def grades_variance(my_list, average):
    variance = 0
    for i in my_list:
        variance += (average - my_list[i]) ** 2
    return variance / len(my_list)

ただし、コードを実行しようとすると、次の行に次のエラーが表示されます。

Line: variance += (average - my_list[i]) ** 2
Error: list index out of range

現在のPython=知識が限られている場合はお詫びしますが、私はまだ学習中です-したがって、この問題の解決を支援したい場合は、これを解決する方法について非常に複雑な方法を提案しないようにしてください、ありがとう本当にたくさん。

9
GiamPy

最初に、Pythonの組み込みsumメソッドを使用して、最初のカスタムメソッドを置き換えることをお勧めします。 _grades_average_は次のようになります。

_def grades_average(my_list):
    sum_of_grades = sum(my_list)
    average = sum_of_grades / len(my_list)
    return average
_

次に、これらのメソッドが組み込まれているため、 NumPyライブラリ を調べることを強くお勧めします。 numpy.mean()およびnumpy.std()は、これらの両方のケースをカバーします。

最初に自分でコードを作成することに興味がある場合は、それもまったく問題ありません。あなたの特定のエラーについては、上の@gnibblerがそれを釘付けにしたと思います。インデックスを使用してループする場合は、_grades_variance_の行を次のように再構成できます。

_for i in range(0, len(my_list)):
_

Lattyware で述べたように、インデックスによるループは特に「Pythonic」ではありません。あなたが現在やっている方法は、一般的に優れています。これは参照用です。

11
Magsol

numpy を試してください。

import numpy as np
variance = np.var(grades)
21
robinfang

あなたが言う時

 for i in my_list:

iは、アイテムのindexではありません。 iisアイテム

for i in my_list:
    variance += (average - i) ** 2
6
John La Rooy

gnibblerがコードの問題を解決した ですが、 組み込み関数ジェネレーター式 を使用すると、これをはるかに簡単に実現できます。

average = sum(grades) / len(grades)
varience = sum((average - value) ** 2 for value in grades) / len(grades)

最初は少し怖いかもしれませんが、ビデオを見ると、リスト内包表記とジェネレーター式についてリンクしています。これらは実際には非常にシンプルで便利です。

5
Gareth Latty

python 3.4にはこれを行う統計libがあります。

   import statistics
   grades = [100, 100, 90, 40, 80, 100, 85, 70, 90, 65, 90, 85, 50.5]
   statistics.pvariance(grades)
=> 334.07100591715977

https://docs.python.org/3/library/statistics.html#statistics.pvariance

5
zengr

以下のコードは、カスタム関数を作成する分散を取得するために使用されます

   def variance(val):
       total_sum=sum(val)
       average=total_sum/len(val)
       a=[]
       for i in val:
           a.append((i-average)**2)
       return sum(a)/len(a)

   val=[2.18,2.22,2.24,1.62,1.32,1.85,1.85,2.70,3.60,4.60,1.38,2.34,2.71]
   variance(val)
0

サンプル分散、つまり分散の不偏推定量が必要だと思います。この機能でうまくいくと思います。ベクトルnの分散と平均を出力します。

n = [5, 3, 1, 2, 4]

def variance1337(n):
    var1 = []
    mean1 = sum(n)/len(n)
    for xs in n:
        var1.append((xs - mean1) ** 2)
    print(sum(var1)/(len(n) - 1))
    print(mean1)
0
Don Juan