効率的なアルゴリズムを検出するさまざまな要素のコレクション
-
22-09-2019 - |
質問
想像のセット五(A-E)----------一部の数値を測定した物件(複数の観測のための各要素は、例えば"心"):
A = {100, 110, 120, 130}
B = {110, 100, 110, 120, 90}
C = { 90, 110, 120, 100}
D = {120, 100, 120, 110, 110, 120}
E = {110, 120, 120, 110, 120}
第, い検出がある場合には有意差を平均です。でも一方 元配置の分散分析 を使用 統計パッケージを提供するApache Commons数学.特に問題なく入手したいのboolean値からかどうかの違いは見つかります。
第, 場合に差異が見つかったかを知る必要がある 要素(または要素とは異なるの.私の使用計画 対t-試験, 比較のなかから、各ペアの要素(AとBとC....D E)知り合要素が異なります。なので、この時点での情報のリストに要素が存在に大きな差は、例えば:
C is different than B
C is different than D
思いつ汎用アルゴリズムを効率的に判定できる情報、どの要素とは異なるその他(Cの例では、以上)してご利用いただけます。
出統計の問題は別の質問できる(一般): これらの情報等/不平等の各一対の要素がコレクションかを判定するための要素/sとしているときは違うかもしれません。"
う問題がグラフ理論が適用されます。を使用してい Java 言語の実装では、という場合が便利です。
編集: 素人および測定値について必要としています。い検出が過ぎたものについては、上記以外の時間も完了のタスクの種類によって不正検出システムです。
解決
だけは場合に誰がにApacheを使用して、最終的なコードに興味がありますコモンズの数学は、プリミティブ型のコレクションで仕事に統計的な操作を行うことがを、そしてトローブに。
これは、最高度を持つ要素(複数可)を探します(アイディアが@Paceと@Anikoによって行われたコメントは、感謝に基づいています)。
私は、最終的なアルゴリズムはO(N ^ 2)であると考え、提案を歓迎します。これは、観測値の正規性を仮定し、1つのcuantitative変数対1 cualitativeに関わるすべての問題のために働く必要があります。
import gnu.trove.iterator.TIntIntIterator;
import gnu.trove.map.TIntIntMap;
import gnu.trove.map.hash.TIntIntHashMap;
import gnu.trove.procedure.TIntIntProcedure;
import gnu.trove.set.TIntSet;
import gnu.trove.set.hash.TIntHashSet;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.math.MathException;
import org.apache.commons.math.stat.inference.OneWayAnova;
import org.apache.commons.math.stat.inference.OneWayAnovaImpl;
import org.apache.commons.math.stat.inference.TestUtils;
public class TestMath {
private static final double SIGNIFICANCE_LEVEL = 0.001; // 99.9%
public static void main(String[] args) throws MathException {
double[][] observations = {
{150.0, 200.0, 180.0, 230.0, 220.0, 250.0, 230.0, 300.0, 190.0 },
{200.0, 240.0, 220.0, 250.0, 210.0, 190.0, 240.0, 250.0, 190.0 },
{100.0, 130.0, 150.0, 180.0, 140.0, 200.0, 110.0, 120.0, 150.0 },
{200.0, 230.0, 150.0, 230.0, 240.0, 200.0, 210.0, 220.0, 210.0 },
{200.0, 230.0, 150.0, 180.0, 140.0, 200.0, 110.0, 120.0, 150.0 }
};
final List<double[]> classes = new ArrayList<double[]>();
for (int i=0; i<observations.length; i++) {
classes.add(observations[i]);
}
OneWayAnova anova = new OneWayAnovaImpl();
// double fStatistic = anova.anovaFValue(classes); // F-value
// double pValue = anova.anovaPValue(classes); // P-value
boolean rejectNullHypothesis = anova.anovaTest(classes, SIGNIFICANCE_LEVEL);
System.out.println("reject null hipothesis " + (100 - SIGNIFICANCE_LEVEL * 100) + "% = " + rejectNullHypothesis);
// differences are found, so make t-tests
if (rejectNullHypothesis) {
TIntSet aux = new TIntHashSet();
TIntIntMap fraud = new TIntIntHashMap();
// i vs j unpaired t-tests - O(n^2)
for (int i=0; i<observations.length; i++) {
for (int j=i+1; j<observations.length; j++) {
boolean different = TestUtils.tTest(observations[i], observations[j], SIGNIFICANCE_LEVEL);
if (different) {
if (!aux.add(i)) {
if (fraud.increment(i) == false) {
fraud.put(i, 1);
}
}
if (!aux.add(j)) {
if (fraud.increment(j) == false) {
fraud.put(j, 1);
}
}
}
}
}
// TIntIntMap is sorted by value
final int max = fraud.get(0);
// Keep only those with a highest degree
fraud.retainEntries(new TIntIntProcedure() {
@Override
public boolean execute(int a, int b) {
return b != max;
}
});
// If more than half of the elements are different
// then they are not really different (?)
if (fraud.size() > observations.length / 2) {
fraud.clear();
}
// output
TIntIntIterator it = fraud.iterator();
while (it.hasNext()) {
it.advance();
System.out.println("Element " + it.key() + " has significant differences");
}
}
}
}
他のヒント
あなたの編集は良い詳細を示します。おかげで、
(;あなたの時間を取得ゼロにどれだけ近いかに依存し、通常、またはおそらくガンマ)の典型的な応答のために、私は時間のかなり行儀の分布を推定することをに基づいて。サンプルは平均値からn個stdevsよりも多くの嘘、または例えば(あなたのデータは素敵なヒープに落ち着くまで、外れ値を除外したサブセットを取るなど、複雑な平均値として標準偏差とシーイングを計算すると、この分布からサンプルを拒否することは簡単なようかもしれません) 'ずっと' 動き回って停止します。
あなたが別で1件の試験の意志猿と猿人と仮定した場合、さて、あなたは追加しわを持っています。 erally「不正行為」である1対だけ速い(または遅い)であることを起こる人を区別しようとしているあなたはとても。そのあなたの統計として、使用:あなたは、各スコアの計算STDEVランクのような何かができる(値は平均以上の2 stdevsであれば、スコアは「2」である私は、このために適切な名前を忘れてしまいました)。
次に、この新しい統計与え、あなたがテストする必要がありますいくつかの仮説があります。例えば、私の疑惑は、この統計のSTDEVがちょうど均一に速く、他の人よりも誰よりも詐欺師の方が高いだろうということです - 。しかし、あなたはそれを確認するためにデータを必要とするだろう。
それで頑張ってください!
あなたは、対応のあるt検定(または任意のペアごとのテストあなたが実装する)とインクリメントキーが人であるとカウントが、それは別の数倍だったでハッシュでカウントを実行する必要があります。
私はあなたにも、人々のオブジェクトが含まれているのArrayListを持つことができると思います。人々のオブジェクトは、自分のIDを格納することができ、時間のカウントは、彼らが異なっていました。 Comparableを実装して、あなたは、カウントによって配列リストを並べ替えることができます。
、あなたは、同時に2つのリストを歩くことができ、かつ任意の違いを簡単に挿入または欠失として認識することができます。たとえば、
List A List B
1 1 // Match, increment both pointers
3 3 // Match, increment both pointers
5 4 // '4' missing in list A. Increment B pointer only.
List A List B
1 1 // Match, increment both pointers
3 3 // Match, increment both pointers
4 5 // '4' missing in list B (or added to A). Incr. A pointer only.