2016-09-07 10 views
1

コードに別の方法があるかどうか疑問に思っていた この問題の中核は、ファイルを読み込んでリスト。そして、あなたが持っているだろうどこに:Python 3.4ファイルを介してモード、中間値を計算する

a = [1,2,3,4,5,6,1,1,1,1] 
import statistics 
listMode = statistics.mode(a) # median, average, etc... 

を私は読んで、私はその場でモードを計算することができるかどうか、疑問に思うの代わりに、(それが非常に大きくなることがようにメモリ)aでこれらの値を保存するために持っていましたファイルを作成し、新しい行を読むたびに1つの値を更新します。つまり、段階的に中央値と平均を計算します。結局私はa = [mode,median,average]を持っていたので。

+0

非常に大きなデータセットであっても、このような単純な操作は非常に長く見えないため、「オンザフライ」を計算する理由は見当たりませんが、最後にすべてを実行する理由はありません – TheLazyScripter

+0

「インクリメンタル」必須?ファイルを一度だけ読み取る場合は、データセット内の各固有値ごとに少なくとも値とカウントを格納する必要があります。ファイル内の値の数と同じ回数だけファイルを読み取ることができれば、必要なストレージはダウンしますが、実行時間は急激に増加します。 – Simon

+0

私は非常に平準化されたネストされた辞書を持っており、巨大なリストを持たないことを望んでおり、同じトークンで私は多くの変数に対してこれをやりたいと思っています。パフォーマンスが重要な問題になった場合、そのオプションがクリアされます。しかし、私はモードとメジアンの仕事に失敗しました。平均はずっと簡単で改善を経験しました。 – FancyDolphin

答えて

3

例のように、入力値のセットが比較的小さい値の場合、Counterを使用して、渡された値の数を数えます。そのCounterから、モードを簡単に取得でき、少しの作業で中央値を取得できます。オンザフライで平均を計算するのは簡単ですが、Counterは必要ありません。実行中の合計と実行中の数をそのまま維持してください。

+0

それはかなり大きいです、それは単なる例にすぎません。カウンターは改善されるだろうが、段階的アプローチが望ましいだろう。合意された平均は、加重平均でさえも簡単です。 – FancyDolphin

+0

私は、各値を数えることなく、正確なモードを得ることを期待していません。何らかの価値のためにカウントを落とすと、敵はその価値のあるエントリをたくさん生成することによってあなたを倒すことができます。しかし、この記事では、近似モードの計算について説明しています。http://stackoverflow.com/questions/1058813/online-iterator-algorithms-for-estimating-statistical-median-mode-skewnes –

+0

ディストリビューションについて知っていればそれをバケットに入れて、各バケットに含まれるエントリの数を数えることができます。次に、最も重いバケツの中点を使って近似モードを得ることができます。 –

関連する問題