我正在尝试使用余弦而不是欧几里德距离对一些似乎可分离的数据进行聚类。我如何使用 MATLAB 的 selforgmap 来实现此目的?我不相信这是通过“distanceFcn”选项实现的。
x = simplecluster_dataset; net = selforgmap([8 8],100,3,'hextop','余弦'); 净=火车(净,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 oolbox 网 网 距离
基本上,要制作自定义距离测量,我们需要使用
dist.m
并重写文件夹 +dist
中的所有 16 个函数以适应新的距离测量。更新距离函数本身(在+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:我认为答案是使用四个内置距离函数之一或编写自定义距离函数。
我相信我可以在这里提供有用的输入:您可以在初始化后通过
dist
访问网络层,而不是重写/添加 net.layers{1}.distanceFcn
文件夹
并手动设置您想要的距离函数。这样,您的代码就可以在任何机器上运行。
那就是
net.layers{1}.distanceFcn = yourdistancefunction
。如果它尚不存在,您仍然需要自己编写 yourdistancefunction
。