在K-Means中传递自定义距离函数

时间:2012-08-27 12:31:27

标签: matlab k-means

有没有办法在MATLAB k-means中传递自定义距离函数(例如jaccard距离) 实施?

jaccard距离函数

D = pdist(X,'jaccard');

2 个答案:

答案 0 :(得分:2)

您需要做的是使用SVD将距离矩阵分解为特征空间,然后在由SVD分数表示的新特征空间上执行kmeans。参见Rob Tibshirani的统计学习要素。

或者你可以做一个与距离矩阵一起工作的k mediods - 在R中的as.dist()会将一个矩阵转换成一个dist对象,然后你可以在其上做K-mediods。

答案 1 :(得分:1)

我们从documentation了解到,我们可以将'distance'选项传递给kmeans

  

'距离'

     

距离测量,在p维空间中。 kmeans最小化   尊重这个参数。 kmeans计算质心簇   不同的支持距离测量方法不同。

     

'sqEuclidean'

     

平方欧氏距离(默认)。每个质心都是平均值   该群集中的点。

     

'cityblock'

     

绝对差值之和,即L1距离。每个质心都是   该群集中各点的分量中位数。

     

'余弦'

     

一个减去点之间夹角的余弦(视为   矢量)。每个质心是该群集中点的平均值,   将这些点标准化为单位欧几里德长度后。

     

'相关性'

     

一个减去点之间的样本相关性(作为序列处理   价值观)。每个质心是分数的分量均值   在将这些点居中并归一化为零之后,该群集   平均值和单位标准差。

     

'汉明'

     

不同的位百分比(仅适用于二进制数据)。每   质心是该群集中点的分量中位数。

所以,例如:

[idx,ctrs] = kmeans(X,2, 'Distance','cityblock');

至于自定义功能(即用户实现):AFAIK,如果不破解相关的m文件,这是不可能的。