MATLAB k-means 実装でカスタム距離関数 (ジャカード距離など) を渡す方法はありますか?
ジャカードディスタンス機能
D = pdist(X,'jaccard');
あなたがする必要があるのは、SVDを使用して距離行列を特徴空間に分解し、次にSVDのスコアによって表される新しい特徴空間でkmeansを実行することです。RobTibshiraniによる統計学習の要素を参照してください。
または、距離行列で機能するk個のメディオッドを実行できます。Rのas.dist()は、行列をdistオブジェクトに変換し、K-メディオッドを実行できます。
ドキュメントから、'distance'
オプションをkmeans
次のように渡すことができることがわかります。
'距離'
p 次元空間での距離測定。kmeans は、このパラメーターに関して最小化します。kmeans は、サポートされているさまざまな距離尺度に対して異なる方法で重心クラスターを計算します。
'平方ユークリッド'
二乗ユークリッド距離 (デフォルト)。各重心は、そのクラスター内のポイントの平均です。
「街区」
絶対差の合計、つまり L1 距離。各重心は、そのクラスター内のポイントの成分ごとの中央値です。
'余弦'
1 からポイント間の夾角のコサインを引いたもの (ベクトルとして扱われる)。各重心は、それらのポイントを単位ユークリッド長に正規化した後の、そのクラスター内のポイントの平均です。
'相関'
1 からポイント間の標本相関を引いたもの (値のシーケンスとして扱われます)。各重心は、それらのポイントをゼロ平均および単位標準偏差にセンタリングおよび正規化した後の、そのクラスター内のポイントの成分ごとの平均です。
「ハミング」
異なるビットのパーセンテージ (バイナリ データにのみ適しています)。各重心は、そのクラスター内のポイントの成分ごとの中央値です。
たとえば、次のようになります。
[idx,ctrs] = kmeans(X,2, 'Distance','cityblock');
カスタム関数(つまり、ユーザーが実装したもの)については、私の知る限り、関連するmファイルをハッキングしない限り、これは不可能です。