それぞれ 10 個の XY 座標を含む小さなデータ セットがいくつかあります。Matlab (R2012a) と k-means を使用して重心を取得しています。一部のクラスター (下図を参照) では、極端な点がいくつか見られます。これは、データセットが非常に小さいため、1 つのアウトライナーが重心の値を破壊するためです。これらの点を除外する簡単な方法はありますか? おそらくMatlabには「外れ値を除外する」機能がありますが、ツールメニューのどこにも表示されません..ありがとうございます!(そして、はい、私はこれが初めてです:-)
2 に答える
k-means は、データ セット内の外れ値に非常に敏感です。その理由は単純に、k-meansが二乗和を最適化しようとするからです。そのため、大きな偏差 (外れ値など) には大きな重みが付けられます。
外れ値のあるノイズの多いデータ セットがある場合は、DBSCAN (Density-Based Spatial Clustering of Applications with Noise)などの特殊なノイズ処理を備えたアルゴリズムを使用することをお勧めします。頭字語の「N」に注意してください: ノイズ。たとえば k-means だけでなく、他の多くのクラスタリング アルゴリズムとは対照的に、DBSCANは低密度の領域にあるオブジェクトをクラスタリングしないことを決定できます。
「外れ値の除去」のようなものを探していますが、他の人が上記にリンクしているように、「外れ値を構成するものの厳密な数学的定義はありません」 - http://en.wikipedia.org/wiki/Outlier#Identifying_outliers。
教師なしクラスタリングを行っている場合、外れ値の検出はさらに困難になります。これは、クラスターが何であるか、および「いいえ」のクラスターに対応するデータ ポイントの両方を学習しようとするためです。
簡単な定義の 1 つは、他のすべてのデータ ポイントから「離れている」すべてのデータ ポイントを外れ値と見なすことです。たとえば、他のポイントまでの距離が最大で最小のポイントを削除することを検討できます。
x = randn(100,2);
x(101,:) = [10 10]; %a clear outlier
nSamples = size(x,1);
pointToPointDistVec = pdist(x);
pointToPointDist = squareform(pointToPointDistVec);
pointToPointDist = pointToPointDist + diag(inf(nSamples,1)); %remove self-distances; set to inf
smallestDist = min(pointToPointDist,[],2);
[maxSmallestDist,outlierInd] = max(smallestDist);
上記を数回繰り返して、ポイントを繰り返し削除できます。これは、少なくとも 1 つの近くの近隣をたまたま持っている外れ値を削除しないことに注意してください。WIKI ページを読んで、より役立つアルゴリズムを見つけたら、それを試して実装し、その特定のアプローチについて質問してください。