例として、気温、風、降水量を測定していると仮定します。これらのアイテムを「機能」と呼びます。したがって、有効な値は次のようになります。
- 温度:-50から100F(私は米国ミネソタ州にいます)
- 風:0から120マイル/時(これが現実的かどうかはわかりませんが、我慢してください)
- 降水量:0〜100
データを正規化することから始めます。Tempの範囲は150ユニット、Wind 120ユニット、Precip100ユニットです。風の単位に1.25を掛け、降水量に1.5を掛けて、気温とほぼ同じ「スケール」にします。ここで空想を得て、1つの機能を他の機能よりも価値のあるものとして評価するルールを作成できます。この例では、風の範囲が広い場合がありますが、通常は範囲が狭いため、結果が歪むのを防ぐために、風の重さを軽くする必要があります。
ここで、各測定値を多次元空間の点として想像してください。この例では、3D空間(温度、風、降水量)を測定します。良い点は、機能を追加すると、空間の次元が増えるだけで、計算は同じままになることです。とにかく、現在のポイントに最も近い履歴ポイントを見つけたいと思います。これを行う最も簡単な方法は、ユークリッド距離です。したがって、現在のポイントから各履歴ポイントまでの距離を測定し、最も近い一致を維持します。
for each historicalpoint
distance = sqrt(
pow(currentpoint.temp - historicalpoint.temp, 2) +
pow(currentpoint.wind - historicalpoint.wind, 2) +
pow(currentpoint.precip - historicalpoint.precip, 2))
if distance is smaller than the largest distance in our match collection
add historicalpoint to our match collection
remove the match with the largest distance from our match collection
next
これはブルートフォースアプローチです。時間があれば、もっと夢中になれるかもしれません。多次元データは、kd-treesやr-treesのようなツリーとして表すことができます。大量のデータがある場合、現在の観測値をすべての過去の観測値と比較するのは遅すぎます。木はあなたの検索をスピードアップします。データクラスタリングと最近傍探索を確認することをお勧めします。
乾杯。