定義された数のリストの分散を出力する関数を作成しようとしています:
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=知識が限られている場合はお詫びしますが、私はまだ学習中です-したがって、この問題の解決を支援したい場合は、これを解決する方法について非常に複雑な方法を提案しないようにしてください、ありがとう本当にたくさん。
最初に、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」ではありません。あなたが現在やっている方法は、一般的に優れています。これは参照用です。
numpy を試してください。
import numpy as np
variance = np.var(grades)
あなたが言う時
for i in my_list:
i
は、アイテムのindexではありません。 i
isアイテム
for i in my_list:
variance += (average - i) ** 2
gnibblerがコードの問題を解決した ですが、 組み込み関数 と ジェネレーター式 を使用すると、これをはるかに簡単に実現できます。
average = sum(grades) / len(grades)
varience = sum((average - value) ** 2 for value in grades) / len(grades)
最初は少し怖いかもしれませんが、ビデオを見ると、リスト内包表記とジェネレーター式についてリンクしています。これらは実際には非常にシンプルで便利です。
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
以下のコードは、カスタム関数を作成する分散を取得するために使用されます
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)
サンプル分散、つまり分散の不偏推定量が必要だと思います。この機能でうまくいくと思います。ベクトル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)