大規模なデータセットで kmeans を実行していますが、常に以下のエラーが発生します。
Error using kmeans (line 145)
Some points have small relative magnitudes, making them effectively zero.
Either remove those points, or choose a distance other than 'cosine'.
Error in runkmeans (line 7)
[L, C]=kmeans(data, 10, 'Distance', 'cosine', 'EmptyAction', 'drop')
私の問題は、すべてのベクトルに 1 を追加しても、このエラーが発生することです。私はそれが合格すると予想しますが、どうやらまだゼロが多すぎるようです (それが原因ですよね?)。
私の質問はこれです.Matlabがポイントが「相対的な大きさが小さく」、「事実上ゼロである」と判断する条件は何ですか?
Python で処理するゴールド スタンダードと結果を比較する必要があるため、データを Matlab に渡す前に、Python を使用してデータセットからこれらすべてのポイントを削除したいと考えています。
前もって感謝します!
編集回答
正解は以下に示されていますが、誰かが Google でこの質問を見つけた場合に備えて、Python で行列から「実質的にゼロのベクトル」を削除する方法を次に示します。すべての行 (!) はデータ ポイントであるため、kmeans を実行している場合は Python または Matlab で転置する必要があります。
def getxnorm(data):
return np.sqrt(np.sum(data ** 2, axis=1))
def remove_zero_vector(data, startxnorm, excluded=[]):
eps = 2.2204e-016
xnorm = getxnorm(data)
if np.min(xnorm) <= (eps * np.max(xnorm)):
local_index=np.transpose(np.where(xnorm == np.min(xnorm)))[0][0]
global_index=np.transpose(np.where(startxnorm == np.min(xnorm)))[0][0]
data=np.delete(data, local_index, 0) # data with zero vector removed
excluded.append(global_index) # add global index to list of excluded vectors
return remove_zero_vector(data, startxnorm, excluded)
else:
return (data, excluded)
これを行うにはもっと科学的な方法があると確信していますが、それで十分です:-)