`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
考虑以下代码:
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