5

簡単な質問があります。Java で不正検出アプリを作成しようとしています。アプリは主にベンフォードの法則に基づいています。ベンフォードの法則は非常にクールです。基本的に、実際の金融取引では、最初の桁は通常 1、2、または 3 であり、8、9 になることはほとんどありません。ベンフォードの公式を取得できませんでした。 Java で実行できるコードに変換されます。

http://www.mathpages.com/home/kmath302/kmath302.htmこのリンクには、ベンフォードの法則とその使用方法に関する詳細情報があります。

自然対数関数を使用できるようにするには Java 数学クラスを使用する必要があることはわかっていますが、その方法がわかりません。どんな助けでも大歓迎です。

本当にありがとう!!

4

3 に答える 3

8

@Rui は確率分布関数の計算方法について言及していますが、ここではあまり役に立ちません。

使用したいのは、コルモゴロフ-スミルノフ検定またはカイ 2 乗検定のいずれかです。どちらも、データを既知の確率分布と比較して、データセットがその確率分布を持つ可能性が高いかどうかを判断するために使用されます。

カイ二乗は離散分布用で、KS は連続用です。


ベンフォードの法則でカイ 2 乗を使用するには、ヒストグラム H[N] を作成します。たとえば、9 つのビン N=1,2,... 9 を使用して、データセットを反復処理して、サンプル数をカウントする最初の桁をチェックします。ゼロ以外の 9 桁 (または 90 個のビンを持つ最初の 2 桁) のそれぞれ。次に、カイ二乗検定を実行して、ヒストグラムを予想カウント E[N] と比較します。

たとえば、100 個のデータがあるとします。E[N] は、ベンフォードの法則から計算できます。

E[1] = 30.1030 (=100*log(1+1))
E[2] = 17.6091 (=100*log(1+1/2))
E[3] = 12.4939 (=100*log(1+1/3))
E[4] =  9.6910
E[5] =  7.9181
E[6] =  6.6946
E[7] =  5.7992
E[8] =  5.1152
E[9] =  4.5757

次に、Χ 2 = sum((H[k]-E[k])^2/E[k]) を計算し、テストで指定されたしきい値と比較します。(ここでは、パラメーターのない固定分布があるため、パラメーターの数 s=0 および p = s+1 = 1 であり、ビンの数 n は 9 であるため、自由度の数 = np = 8*.次に、便利なカイ 2 乗表に移動して、数字が適切に見えるかどうかを確認します.8 自由度の場合、信頼水準は次のようになります。

Χ 2 > 13.362: データセットがまだベンフォードの法則に一致する可能性は 10%

Χ 2 > 15.507: データセットがまだベンフォードの法則に一致する可能性は 5%

Χ 2 > 17.535: 2.5% の可能性で、データセットがまだベンフォードの法則に一致している

Χ 2 > 20.090: データセットがまだベンフォードの法則に一致する可能性は 1%

Χ 2 > 26.125: 0.1% の確率で、データセットはまだベンフォードの法則に一致します

ヒストグラムが H = [29,17,12,10,8,7,6,5,6] となり、Χ 2 = 0.5585 であるとします。これは、予想される分布に非常に近いものです。(近すぎるかも!)

ここで、ヒストグラムが H = [27,16,10,9,5,11,6,5,11] (Χ 2 = 13.89) を生成したとします。このヒストグラムがベンフォードの法則に一致する分布からのものである可能性は 10% 未満です。したがって、私はデータセットを疑わしいと呼びますが、それほどそうではありません.

有意水準を選択する必要があることに注意してください(例: 10%/5%/など)。10% を使用する場合、実際には Benford のディストリビューションからのものであるデータセットの約 10 分の 1 は、問題がなくても失敗することが予想されます。判断の合図です。

Apache Commons Math には、カイ 2 乗検定の Java 実装があるようです。

ChiSquareTestImpl.chiSquare(double[] expected, long[] observed)


*自由度 = 8 に関する注意: これは理にかなっています。9 つの数値がありますが、1 つの制約があります。つまり、データセットのサイズまですべてを合計する必要があるため、ヒストグラムの最初の 8 つの数値がわかれば、9 番目を計算できます。


Kolmogorov-Smirnov は実際にはより単純ですが (それがどのように機能するかについての十分に単純なステートメントを見つけるまで、私は気づいていませんでした)、連続分布に対して機能します。メソッドは次のように機能します。

  • 確率分布の累積分布関数 (CDF) を計算します。
  • 経験的累積分布関数 (ECDF) を計算します。これは、データセットを並べ替えることで簡単に取得できます。
  • D = (おおよそ) 2 つの曲線間の最大垂直距離を見つけます。

ここに画像の説明を入力

ベンフォードの法則のために、これらをさらに詳しく扱いましょう。

  1. ベンフォードの法則の CDF: これは単に C = log 10 x であり、x は区間 [1,10) にあります。つまり、1 を含み、10 を除きます。これは、ベンフォードの法則の一般化された形式を見れば簡単にわかります。log(1+1/n) と書く代わりに、log(n+1)-log(n) と書きます。つまり、各ビンの確率を得るために、log( n) であるため、log(n) は CDF でなければなりません

  2. ECDF: データセットを取得し、各数値の符号を正にし、指数表記で書き、指数を 0 に設定します。ベンフォードの法則分析へ。) 次に、数値を昇順に並べ替えます。ECDF は、有効な x のデータポイント <= x の数です。

  3. 各 d[k] = max(CDF(y[k]) - (k-1)/N, k/N - CDF(y[k]) の最大差 D = max(d[k]) を計算します。

以下に例を示します。データセット = [3.02, 1.99, 28.3, 47, 0.61] とします。次に、ECDF は並べ替えられた配列 [1.99, 2.83, 3.02, 4.7, 6.1] で表され、次のように D を計算します。

D = max(
  log10(1.99) - 0/5, 1/5 - log10(1.99),
  log10(2.83) - 1/5, 2/5 - log10(2.83),
  log10(3.02) - 2/5, 3/5 - log10(3.02),
  log10(4.70) - 3/5, 4/5 - log10(4.70),
  log10(6.10) - 4/5, 5/5 - log10(6.10)
)

= 0.2988 (=log10(1.99) - 0)。

最後に、D 統計を使用する必要があります。オンラインで信頼できるテーブルを見つけることはできませんが、Apache Commons Math には、計算された D 値を入力として取り、D がそうなる確率を示すKolmogorovSmirnovDistributionImpl.cdf()関数がありますこれ以下にしてください。D が計算した値以上になる確率を示す 1-cdf(D) を取得する方がおそらく簡単です。これが 1% または 0.1% の場合、おそらくデータがベンフォードの法則に適合しないことを意味します。ですが、25% か 50% であれば、おそらく良い一致です。

于 2011-10-19T11:57:03.853 に答える
4

私の理解が正しければ、Java 構文でのベンフォード式が必要ですか?

public static double probability(int i) {   
    return Math.log(1+(1/(double) i))/Math.log(10);
}

挿入することを忘れないでください

import java.lang.Math;

あなたのパッケージ宣言の後。

まだ誰もこれに答えていないのは疑わしいと思います.... >_>

于 2011-10-19T10:14:50.563 に答える