我正在尝试使用余弦而不是欧几里得距离对一些似乎可分离的数据进行聚类。为此,我如何使用 MATLAB 的selforgmap?我不相信这是通过“distanceFcn”选项。
x = simplecluster_dataset;net = selforgmap([8 8],100,3,'hextop','cosine'); 净=火车(净,X);视图(净) y = 净(x);类 = vec2ind(y);
我正在尝试使用余弦而不是欧几里得距离对一些似乎可分离的数据进行聚类。为此,我如何使用 MATLAB 的selforgmap?我不相信这是通过“distanceFcn”选项。
x = simplecluster_dataset;net = selforgmap([8 8],100,3,'hextop','cosine'); 净=火车(净,X);视图(净) y = 净(x);类 = vec2ind(y);
您正在谈论自定义距离功能。我相信 distancefcn 确实是正确的地方。但是似乎没有记录为 MATLAB 的 SOM 实现制作替代距离函数。
nntype.distanceFcn 的默认值为“linkdist”。以下是神经网络工具箱距离函数:
>> 帮助 nndistance 神经网络工具箱距离函数。
boxdist - Box distance function. dist - Euclidean distance weight function. linkdist - Link distance function. mandist - Manhattan distance function.
我们可以发现:
>> 帮助 nncustom:
距离函数... 使用 dist 及其子函数包 +dist 作为模板。
嗯,这有点帮助,因为现在我们知道如何实现自定义函数了。当我们打开文件 dist,然后尝试“另存为”我们可以找到它的包位置。对于我在 Windows 上,这是:C:\Program Files\MATLAB\R2015b\toolbox\nnet\nnet\nndistance
基本上要进行自定义距离测量,我们需要使用dist.m
并重写文件夹中的所有 16 个函数+dist
以适应新的距离测量。仅更新距离函数本身(在 中实现)是不够的,+dist/apply.m
我们还必须更新导数 `+dist/dz_dp.m'。
使用余弦相似度距离的最简单方法是通过归一化点积。与其做 dist 所做的(p' * p)
,不如使用统计工具箱pdist(p, 'cosine')
。我想权重函数 normprod 在编写自定义距离函数时会有所帮助,但这还不够。此外,遗憾的是神经网络工具箱没有被评论。的代码dist
是在 2005 年编写的,所以看起来 Mathworks 在这个领域并不活跃。我个人使用 SOMToolbox,但它也没有余弦距离函数。
我搜索了互联网,但找不到其他实现自定义距离功能的人。为此,我尝试修改权重函数 normprod,但内部检查显然在某处失败(错误COSDIST.dz_dp is not consistent with numerical derivative.
)
TLDR:我认为答案是要么使用四个内置距离函数之一,要么编写自定义距离函数。