I would like to create an array of Zipf Distributed values withing range of [0, 1000].
I am using numpy.random.zipf to create the values but I cannot create them within the range I want.
How can I do that?
I would like to create an array of Zipf Distributed values withing range of [0, 1000].
I am using numpy.random.zipf to create the values but I cannot create them within the range I want.
How can I do that?
正規化して 1000 倍しますか?
a=2
s = np.random.zipf(a, 1000)
result = (s/float(max(s)))*1000
print min(s), max(s)
print min(result), max(result)
値の範囲が生成された値の数の関数であることは、zipfの全体的なポイントではありませんか?
Zipf値を特定の範囲に強制することは非常に珍しいことであり、何か間違ったことをしている可能性が高いという元の回答(Felix)に同意します。
そうは言っても、実際には同様の問題があり、特定の基準に準拠した Zipf 値を生成する必要がありました。私の場合、既存のデータ セットに似たまったく新しいデータ セットを生成したいと考えていました。合計を既存の分布と同じにしたかったのですが、値は異なっていました。
私の見解では、気に入った値が得られるまで値を数回再生成することが可能です。
#Generate a quantity of Zipf-distributed values close to a desired sum
def gen_zipf_values(alpha, sum, quantity):
best = []
best_sum = 0
for _ in range(10):
s = np.random.zipf(alpha,quantity)
this_sum = s.sum()
if (this_sum > best_sum) and (this_sum <= sum):
best = s
best_sum=this_sum
return best
繰り返しますが、このソリューションは私の問題に合わせて調整されており、合計に近い値を生成したいと考えていました。また、アルファをどのようなものにしたいかについても、毎回かなり良いアイデアを持っていました。わかりやすくするために、条件のチェック、並べ替えなどの一部を省略しました。
ただし、数回以上実行する必要がある場合 (つまり、分布を取得するために for ループを 100 万回実行する必要がある場合)、おそらく何か問題があります (アルファ、または値に対する非現実的な期待など)。「コンピューターに仕事を任せる」、またはいくつかの合理的なオプションから最適なオプションを厳選することは有効だと思います。