質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

統計

統計は、集団現象を数量で把握することです。また、調査で得られた性質や傾向を数量的に表したデータのことをいいます。

Q&A

解決済

1回答

1944閲覧

サンプリングした値の集合が一様分布に従っているか判断する方法を知りたい

unknown_user

総合スコア68

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

統計

統計は、集団現象を数量で把握することです。また、調査で得られた性質や傾向を数量的に表したデータのことをいいます。

0グッド

2クリップ

投稿2020/12/22 22:29

編集2020/12/22 22:49

区間[0,1]の一様分布からサンプリングした値の集合が、一様分布に従っているか判断する方法を知りたいです。
サンプリングした値の平均0.5、分散1/12 (0.0833) に近いかで判断する方法よりも正確な方法をお願いします。

平均・分散だけの判断だと等差数列0.005, 0.015, ..., 0.995は平均0.5、分散0.0833になります。

python

1statistics.mean([0.01 * i + 0.005 for i in range(100)]) # 0.5 2statistics.pvariance([0.01 * i + 0.005 for i in range(100)]) # 0.0833

しかし、0.2113を50サンプルと0.7887を50サンプルの集合も平均0.5、分散0.0833になり、等差数列と明らかに従う分布が異なりますが区別できません。

python

1statistics.mean([0.2113] * 50 + [0.7887] * 50) # 0.5 2statistics.pvariance([0.2113] * 50 + [0.7887] * 50) # 0.0833

分布間の距離といえばKL情報量とかを思い浮かべますが、サンプリング集合から計算する方法を知りたいです。別の方法でも構いません。

追記:

よくよく考えれば0.1区切りのヒストグラムでbinのサンプル数の分散を見れば十分かもしれません。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jbpb0

2020/12/22 23:58 編集

質問の意味が、乱数が本当に「ランダムなのか」検定したい、ということならば、たとえば下記で提案されてる「RMTテスト」は実数の乱数の検定もできる、とのことです https://repository.lib.tottori-u.ac.jp/files/public/0/4496/20180622150003229055/G21_15101A00282.pdf 質問の意味が、「ランダムなのか」ではなく「一様なのか」でしたら、的外れかもしれません (論文詳しく読んで無いので、分布の形の検定に使えるのかは分かりません) 【追記】質問読み直したら、そもそも対象が「乱数」って書いてないですね 完全に的外れですね 失礼しました
unknown_user

2020/12/23 00:24

ご回答ありがとうございます。一様分布に従うデータに対する異常検知をしたくて質問をしました。ややこしくてすいませんでした。 RMTテストという乱数の検定方法があるのですね。参考にさせていただきます。
jbpb0

2020/12/23 01:24

> 0.1区切りのヒストグラムでbinのサンプル数の分散を見れば 元データが完全な一様分布だとすると、各binには平均して全データ数の1/10が入るので、その数から(元データが完全な一様分布だったとしても発生してしまう)各binに入るデータ個数のバラツキを統計的に計算しておいて、その予想バラツキよりも変動が大きかったらアラームを上げる、みたいな感じですかね
unknown_user

2020/12/23 02:53

はい、おっしゃる通りの方法が現時点で無難かなと感じております。最初の例 (等差数列の集合と偏った集合) だと、それぞれ分散が0と400なので区別できそうです。 ```python statistics.pvariance([10] * 10) # 0 statistics.pvariance([0] * 8 + [50] * 2) # 400 ``` binの頻度なら全体をサンプル数で割れば離散確率分布になるので、対象が一様分布に限らず、分布間の距離を一応計算できるかなと思っています。
fana

2020/12/25 01:37 編集

サンプル集合が,ある分布に従っているかどうかを検定する,という話でしょうか. そうであれば,分布の検定の話を調べると良いのではないかと思います. "K-S検定" (コルモゴロフ-スミルノフ検定) とか何とかいうやつがそれっぽい? ググった内容を斜め読みしただけの感じですが, 検定対象の分布(今回は一様分布)の累積確率密度関数とサンプルの累積との差を見るっぽい(?)ので, 「等差数列0.005, 0.015, ..., 0.995」よりも「0.2113を50サンプルと0.7887を50サンプル」のほうが「それっぽくない」という結果が得られるのではないかと想像します.
unknown_user

2020/12/28 15:02 編集

> "K-S検定" (コルモゴロフ-スミルノフ検定) とか何とかいうやつがそれっぽい? ご回答ありがとうございます。K-S検定はまさに私が知りたかったものでした。 調べてみましたが結構簡単に求められますね。ヒストグラムの差よりも累積分布の差を見る方がビンの数を決める必要がなくサンプル数に左右されず理にかなっていそうなので、大変ありがたい情報です。
guest

回答1

0

ベストアンサー

一様分布の累積分布は線形になるのでこれを応用するといいかと思います。

python

1x1 = stats.uniform.rvs(loc=0,scale=1,size=100) # 一様分布からの乱数 2x2 = np.array([0.01 * i + 0.005 for i in range(100)]) # 疑似的に生成した一様分布 3x3 = np.array([0.2113] * 50 + [0.7887] * 50) # 平均・分散が同じである非一様分布 4 5x1_cdf = stats.uniform.cdf(np.sort(x1),loc=0,scale=1) 6plt.plot(x1_cdf) # 大体線形になる 7 8x2_cdf = stats.uniform.cdf(np.sort(x2),loc=0,scale=1) 9plt.plot(x2_cdf) # 線形になる 10 11x3_cdf = stats.uniform.cdf(np.sort(x3),loc=0,scale=1) 12plt.plot(x3_cdf) # 線形にならない 13

分析対象データが微妙な場合は計算が必要なので上記を拡張します。
考え方は以下の通りです。
・手元データと同件数の一様分布のデータをランダムに比較対象として生成して累積分布を計算する。
・手元データと比較対象の累積分布を比較して一様分布からサンプリングされていることを判定する。

python

1result = [] 2 3for i in range(1000) : 4 x1 = np.sort(stats.uniform.rvs(loc=0,scale=1,size=100)) 5 x1_cdf = stats.uniform.cdf(x1,loc=0,scale=1) 6 x3_cdf = stats.uniform.cdf(x3,loc=0,scale=1) 7 tmp = np.mean(x1_cdf-x3_cdf) 8 result.append(tmp) 9

なお、ランダムにデータを生成していることによる偶然性を排除するため、上記では1000回の試行をしています。
上記は、サンプル単位の際の算術平均を評価値にしていますが、同時分布とみなして対数変換した合計値を用いたほうがいいかもしれません。

投稿2020/12/27 04:05

R.Shigemori

総合スコア3376

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

unknown_user

2020/12/28 14:36

ご回答ありがとうございます。この方法はとても良いですね。 ヒストグラムだとビンの数を決める必要がありましたが、累積分布ならサンプル数に左右されずパラメタも必要ないのがいいですね。 > 同時分布とみなして対数変換した合計値を用いたほうがいいかもしれません。 対数の和=積の対数はわかるのですが何に対する対数の和でしょうか?あと同時分布としてスコアを求める方がいい理由は何でしょうか?質問続きで申し訳ありません。
R.Shigemori

2020/12/29 17:33

同時分布は確率の積です。よって、累積分布の積の差を評価指標としたほうが適切ではないか、というのが問題意識です。この確率の積を求める際、サンプルが10個程度であれば積を計算することが可能ですが、十分に多いと桁あふれするので対数変換して和を計算する必要があります。 以上が、質問部分の意味合いになります
unknown_user

2020/12/31 04:06

ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問