2017-04-25 9 views
2

私は、それぞれの行に-で区切られた約700行のファイル(corpus.txtと言う)を持っています。たとえば:Zipf Distribution:Python/Numpyを使ってZipf Distributionを測定するには

86-55-267-99-121-72-336-89-211 
59-127-245-343-75-245-245 

まず私は、ファイルからデータを読み取り、各番号の周波数を見つけ、これらの数字のジップ分布を測定して、分布をプロットする必要があります。私は仕事の最初の2つの部分をやった。私はZipfの配布を描いていません。

私はこのためにnumpy.random.zipf(a, size=None)を使用することを知っています。しかし、私はそれを使用することは非常に難しいと思っています。ポインタやコードスニペットは非常に便利です。

コード:

# Counts frequency as per given n 
def calculateFrequency(fileDir): 
    frequency = {} 
    for line in fileDir: 
    line = line.strip().split('-') 
    for i in line: 
     frequency.setdefault(i, 0) 
     frequency[i] += 1 
    return frequency 

fileDir = open("corpus.txt") 
frequency = calculateFrequency(fileDir) 
fileDir.close() 
print(frequency) 

## TODO: Measure and draw zipf distribution 
+1

'numpy.random.zipf(サイズ=なし確率密度関数と共にサンプルのヒストグラムのプロット) 'はZipf分布を生成しません。 Zipfディストリビューションからサンプルを描画します。データをパラメトリックなZipfディストリビューションに収め、最適なパラメータを推定する必要があります。 – DyZ

+0

私はnumpyとscipyものに新しいです。データをパラメトリックZipfディストリビューションに収め、最適なパラメータを推定するにはどうすればよいですか? 私が上記のように、私は個々の数字の頻度カウントを持っています。 –

+0

関連するコードを追加できますか? – kmario23

答えて

2

あなたの質問にnumpy.random.zipfを使用することが困難だったのでnumpy.random.zipf(a, size=None)が、しかし> 1.

の指定されたパラメータでzipf分布から引き出されたサンプルのプロットを生成します述べたように方法は、scipy zipf documentationサイトで議論されているような素朴な試みです。

以下は、1行に10行のランダムデータを持つシミュレートされたcorpus.txtです。しかし、再循環をシミュレートするために、各ラインは他のラインと比較して重複する可能性があります。

16-45-3-21-16-34-30-45-5-28 
11-40-22-10-40-48-22-23-22-6 
40-5-33-31-46-42-47-5-27-14 
5-38-12-22-19-1-11-35-40-24 
20-11-24-10-9-24-20-50-21-4 
1-25-22-13-32-14-1-21-19-2 
25-36-18-4-28-13-29-14-13-13 
37-6-36-50-21-17-3-32-47-28 
31-20-8-1-13-24-24-16-33-47 
26-17-39-16-2-6-15-6-40-46 

ワーキングコード

import csv 
from operator import itemgetter 
import matplotlib.pyplot as plt 
from scipy import special 
import numpy as np 

#Read '-' seperated corpus data and get its frequency in a dict 
frequency = {} 
with open('corpus.txt', 'rb') as csvfile: 
    reader = csv.reader(csvfile, delimiter='-', quotechar='|') 
    for line in reader: 
     for word in line:    
      count = frequency.get(word,0) 
      frequency[word] = count + 1 

#define zipf distribution parameter 
a = 2. 

#get list of values from frequency and convert to numpy array 
s = frequency.values() 
s = np.array(s) 

# Display the histogram of the samples, along with the probability density function: 
count, bins, ignored = plt.hist(s, 50, normed=True) 
x = np.arange(1., 50.) 
y = x**(-a)/special.zetac(a) 
plt.plot(x, y/max(y), linewidth=2, color='r') 
plt.show() 

enter image description here
関連する問題