`tf.keras.utils.normalize()` 中的 `order` 参数是什么意思?

What does the `order` argument mean in `tf.keras.utils.normalize()`?

考虑以下代码:

import numpy as np

A = np.array([[.8, .6], [.1, 0]])
B1 = tf.keras.utils.normalize(A, axis=0, order=1)
B2 = tf.keras.utils.normalize(A, axis=0, order=2)

print('A:')
print(A)
print('B1:')
print(B1)
print('B2:')
print(B2)

哪个returns

A:
[[0.8 0.6]
 [0.1 0. ]]
B1:
[[0.88888889 1.        ]
 [0.11111111 0.        ]]
B2:
[[0.99227788 1.        ]
 [0.12403473 0.        ]]

我了解 B1 是如何通过 order=1 计算的,因此 A 中的每个条目都除以其列中元素的总和。例如,0.8 变为 0.8/(0.8+0.1) = 0.888。但是,我无法弄清楚 order=2 是如何产生 B2 的,也找不到任何关于它的文档。

1阶将输入归一化,使所有元素的绝对值之和为1(输入的L1范数等于1)。 2 阶对输入进行归一化,使得所有元素的平方值之和为 1(输入的 L2 范数等于 1)。

order 参数中传递阶数 2,意味着您将应用 Tikhonov 正则化 ,通常称为 L2。 L1 和 L2 是不同的正则化技术,各有利弊,您可以在 wikipedia and here in kaggle 中详细阅读。 L2 的方法是求解回归的标准方程,在计算残差平方和时添加一个额外的项 λβTβ 这是转置矩阵 Beta 的平方(这就是它被称为 L2 的原因, 因为正方形).

However, I just can't figure out how order=2 produces B2 nor can I find any documentation about it.

order=1 表示 L1 范数,而 order=2 表示 L2 范数。对于 L2 范数,您需要在对各个平方求和后取平方根。对哪些元素进行平方取决于轴。

喀拉斯

A = np.array([[.8, .6], [.1, 0]])
B2 = tf.keras.utils.normalize(A, axis=0, order=2)
print(B2)

array([[0.99227788, 1.        ],
       [0.12403473, 0.        ]])

手动

B2_manual = np.zeros((2,2))
B2_manual[0][0] = 0.8/np.sqrt(0.8 ** 2 + 0.1 ** 2)
B2_manual[1][0] = 0.1/np.sqrt(0.8 ** 2 + 0.1 ** 2)
B2_manual[0][1] = 0.6/np.sqrt(0.6 ** 2 + 0 ** 2)
B2_manual[1][1] =  0 /np.sqrt(0.6 ** 2 + 0 ** 2)
print(B2_manual)

array([[0.99227788, 1.        ],
       [0.12403473, 0.        ]])

您可以在这里查看不同类型的规范: https://en.wikipedia.org/wiki/Norm_(mathematics) 工作的例子: https://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.norm.html