有没有办法在 MATLAB k-means 实现中传递自定义距离函数(例如 jaccard 距离)?
杰卡德距离函数
D = pdist(X,'jaccard');
您需要做的是使用 SVD 将距离矩阵分解为特征空间,然后对由 SVD 的分数表示的新特征空间执行 kmeans。参见 Rob Tibshirani 的《统计学习要素》。
或者你可以做 k 个与距离矩阵一起工作的 mediods - R 中的 as.dist() 会将一个矩阵转换为一个 dist 对象,然后你可以在这个对象上做 K-mediods。
从文档中,我们了解到我们可以将'distance'
选项传递给kmeans
:
'距离'
距离测量,在 p 维空间中。kmeans 对此参数进行最小化。kmeans 为不同的支持距离度量计算不同的质心簇。
'sq欧几里得'
平方欧几里得距离(默认)。每个质心是该集群中点的平均值。
'城市街区'
绝对差之和,即L1距离。每个质心是该集群中点的组件中位数。
'余弦'
一减去点之间夹角的余弦(视为向量)。在将这些点标准化为单位欧几里得长度之后,每个质心都是该簇中点的平均值。
'相关性'
一减去点之间的样本相关性(视为值序列)。在将这些点居中并将这些点归一化为零均值和单位标准偏差之后,每个质心都是该簇中点的分量均值。
'汉明'
不同位的百分比(仅适用于二进制数据)。每个质心是该集群中点的组件中位数。
因此,例如:
[idx,ctrs] = kmeans(X,2, 'Distance','cityblock');
至于自定义功能(即用户实现):AFAIK,如果不破解相关的 m 文件,这是不可能的。