我有180个元素的列向量,用于将其作为特征应用于我读取的任何模式识别算法,因为我们需要对向量进行归一化。
矢量的最大值和最小值分别为19.04881和8.4015。
首先我使用了matlab内置函数normc(vector)
,当我检查max和min的值时,我分别得到0.0693和0.0306。
其次,我使用normalised_vector = (vector-min(vector))./max(vector)
将值标准化为范围0和1,其中我分别获得了最大值和最小值0.5589和0。
当在matlab中使用normc函数的描述时,它描述为给定矩阵的归一化。但是其他例子给了我第二种方法。 在这两种方式中,标准化值完全不同,当使用这些值应用我的算法时,结果完全不同。 当我有负值时,这两种方法都不起作用。
哪种方式的数据规范化是正确的方法?或者我的理解是错的? 或者我在这里错过了一些概念? 我比较两种不相关的方法吗? 请指教!
答案 0 :(得分:2)
正如@excaza所说,规范化对你的应用程序有不同的含义。
如果通过标准化表示重新缩放或映射,则在规范化到范围[0 1]
时,最小值和最大值将重新缩放为{分别为{1}}和0
。因此,您提到的第二种方法实际上是使用最小值和最大值以及线性缩放从一个范围映射到另一个范围。
要将范围1
中的矢量映射到范围[a b]
,您可以遵循以下公式:
[0 1]
例如在MATLAB中:
v2 = (v1 – a) / (b-a);
通常,要从范围V = 10*rand(10,1)+2;
Vscaled = (V-min(V))/(max(V)-min(V))
映射到范围[a b]
,请使用以下公式:
[c d]
您还可以write a function进行此类扩展。