我正在尝试使用COSINE而不是欧几里德距离来聚类一些似乎可以分离的数据。为此,我如何使用MATLAB的 selforgmap ?我不相信它是通过距离Fnn'选项。
x = simplecluster_dataset; net = selforgmap([8 8],100,3,' hextop''余弦'); net = train(net,x); view(net)y = net(x); classes = vec2ind(y);
答案 0 :(得分:2)
您正在谈论自定义距离功能。我相信distancefcn确实是正确的观察地点。但是,为MATLAB实现SOM制作替代距离函数似乎没有记录。
nntype.distanceFcn的默认值是' linkdist'。以下是神经网络工具箱距离函数:
>> help 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
并重写文件夹+dist
中的所有16个函数以适应新的距离测量。它不足以更新距离函数本身(在+dist/apply.m
中实现),但我们还必须更新衍生物`+ dist / dz_dp.m'。
使用余弦相似距离的最简单方法是通过归一化点积。我们宁愿使用统计工具箱(p' * p)
,而不是做pdist(p, 'cosine')
。我想认为权重函数normprod会在编写自定义距离函数时提供一些帮助,但这还不够。另外,遗憾的是神经网络工具箱没有被评论。 dist
的代码是在2005年编写的,因此似乎Mathworks在此字段中不活跃。我个人使用SOMToolbox,但它也没有余弦距离函数。
我在互联网上搜索但无法找到其他已实现自定义距离功能的人。我试图为此目的修改权重函数normprod,但内部检查显然在某处失败(错误COSDIST.dz_dp is not consistent with numerical derivative.
)
TLDR:我认为答案是使用四个内置距离函数中的一个或编写自定义距离函数。