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