在SOM中标准化数据和/或权重向量是否正确?

Spa*_*cey 4 machine-learning normalization neural-network som self-organizing-maps

所以我被一些(应该)简单的事情所困扰:

我为一个简单的"播放"二维数据集编写了一个SOM.这是数据:

在此输入图像描述

你可以自己制作3个集群.

现在,有两件事令我困惑.第一个是我拥有的教程,在SOM开始工作之前规范化数据.这意味着,它将每个数据向量标准化为长度为1.(欧几里德范数).如果我这样做,那么数据看起来像这样:

在此输入图像描述

(这是因为所有数据都已投射到单位圆上).

所以,我的问题如下:

1)这是正确的吗?将数据投射到单位圆上似乎很糟糕,因为你不能再制作3个星团......这对SOM来说是生活中的事实吗?(即,他们只在单位圆上工作).

2)第二个相关问题是,不仅数据被标准化为具有长度1,而且每次迭代之后每个输出单元的权重向量也是如此.我明白他们这样做是为了让重量矢量不会'爆炸',但我觉得这是错误的,因为重量矢量的整个点是保留距离信息.如果将它们标准化,则会失去正确"聚类"的能力.例如,SOM如何区分左下方的集群和右上方的集群,因为它们以相同的方式向下投射到单位圆?

我很困惑.是否应将数据标准化为SOM中的单位长度?重量矢量是否也应该标准化?

谢谢!

编辑

这是数据,保存为MATLAB的.mat文件.它是一个简单的二维数据集.

pat*_*ter 10

要决定是否要对输入数据进行标准化,这取决于这些数据代表什么.假设您在二维(或三维)输入数据上进行聚类,其中每个数据向量表示一个空间点.第一维是x坐标,第二维是y坐标.在这种情况下,您不会对输入数据进行标准化,因为输入要素(每个维度)在彼此之间是可比较的.

如果您在二维空间上再次进行聚类,但每个输入向量代表一个人的年龄和年收入,则第一个特征(维度)是年龄,第二个是年收入,那么您必须规范化输入要素,因为它们代表不同的东西(不同的测量单位),并且完全不同.让我们检查这些输入向量:D1(25,30000),D2(50,30000)和D3(25,60000).与D1相比,D2和D3都是其中一项功能的两倍.请记住,SOM使用欧几里德距离测量.距离(D1,D2)= 25,距离(D1,D3)= 30000.对于第一个输入特征(年龄)来说,它有点"不公平",因为尽管你加倍,你得到的距离远小于第二个例子( D1,D3).

检查一下,这也有类似的例子

如果要对输入数据进行标准化,则可以对每个要素/维度(输入数据表中的每一列)进行标准化.引自som_normalize手册:

"规范化始终是单变量操作"

另请查看这里有关标准化的简要说明,如果您想阅读更多,请尝试这一点(第7章是您想要的)

编辑:

最常见的归一化方法是将每个维度数据缩放到[0,1]或将它们转换为零均值和标准差1.首先通过从每个输入中减去其维度(列)的最小值和除法来完成最大值minun最小值(其尺寸).

Xi,norm =(Xi - Xmin)/(Xmax-Xmin)

Yi,norm =(Yi - Ymin)/(Ymax-Ymin)

在第二种方法中,您减去每个维度的平均值,然后除以标准差.

Xi,norm =(Xi - Xmean)/(Xsd)

每种方法都有利弊.例如,第一种方法对数据中的异常值非常敏感.您应该在检查数据集的统计特征后进行选择.

在单位圆中投影实际上不是标准化方法,而是更多的尺寸减小方法,因为在投影之后,您可以用单个数字(例如,其角度)替换每个数据点.你不必这样做.


Sta*_*tan 3

在 SOM 训练算法中,使用一堆不同的度量来计算向量(模式和权重)之间的距离。仅举几个(也许是最广泛使用的):欧氏距离和点积。如果将向量和权重标准化为统一,它们是等价的,并且允许网络以最有效的方式学习。例如,如果您没有对当前数据进行标准化,网络将以不同的偏差处理来自输入空间不同部分的点(值越大效果越大)。这就是为什么统一归一化很重要,并且对于大多数情况被认为是适当的步骤(特别是,如果使用点积作为度量)。

您的源数据应先准备好,然后才能标准化为单位圆。您应该将数据映射到两个轴的 [-1, 1] 区域。为此存在多种算法,其中一种使用简单的公式:

mult_factor = 2 / (最大 - 最小);
offset_factor = 1 - 2 * 最大值 / (最大值 - 最小值),

其中minmax是数据集或域边界(如果事先已知)中的最小值和最大值。每个维度都单独处理。对于您的情况,这将是 X 和 Y 坐标。

Xnew = Xold * Xmult_factor + Xoffset_factor, i = 1..N
Ynew = Yold * Ymult_factor + Yoffset_factor, i = 1..N

无论映射之前minmax之前的实际值是什么(在您的情况下可以是 [0,1] 或 [-3.6, 10]),映射之后它们将落入范围 [-1, 1] 。实际上,上面的公式是专门用于将数据转换为范围 [-1, 1] 的,因为它们只是从一个范围到另一个范围的一般转换过程的特例:

数据[i] = (数据[i] - old_min) * (new_max - new_min) / (old_max - old_min) + new_min;

映射完成后,您可以继续归一化为单位圆,这样您最终将得到一个以 [0, 0] 为中心的圆。

您可以在此页面上找到更多信息。尽管该网站总体上与神经网络无关,但该特定页面提供了对 SOM 的良好解释,包括数据标准化的描述性图表。