二进制数而不是一个热向量
Binary numbers instead of one hot vectors
在进行逻辑回归时,通常的做法是使用一个热向量作为期望的结果。所以,no of classes = no of nodes in output layer
。我们不使用词汇表中的单词索引(或一般的 class 数字),因为这可能会错误地指示两个 class 的接近度。但是为什么我们不能使用二进制数而不是单热向量呢?
即如果有 4 个 class,我们可以将每个 class 表示为 00,01,10,11,从而在输出层中产生 log(no of classes)
个节点。
用二进制编码就可以了。但是您可能需要根据您的任务和模型添加另一层(或过滤器)。因为由于二进制表示,您的编码现在涉及无效的共享功能。
例如,输入的二进制编码 (x = [x1, x2]
):
'apple' = [0, 0]
'orange' = [0, 1]
'table' = [1, 0]
'chair' = [1, 1]
表示orange
和chair
具有相同的特征x2
。现在预测两个 类 y
:
'fruit' = 0
'furniture' = 1
和标记数据样本的线性优化模型(W = [w1, w2]
和偏差 b
):
(argmin W) Loss = y - (w1 * x1 + w2 * x2 + b)
每当您将 chair
的 w2
权重更新为 furniture
时,您都会得到一个不受欢迎的更新,就好像将 orange
也预测为 furniture
一样。
在这种特殊情况下,如果您添加另一层 U = [u1, u2]
,您可能可以解决此问题:
(argmin U,W) Loss = y - (u1 * (w1 * x1 + w2 * x2 + b) +
u2 * (w1 * x1 + w2 * x2 + b) +
b2)
好的,为什么不通过使用单热编码来避免这种错误表示。 :)
https://github.com/scikit-learn-contrib/categorical-encoding
category_encoders 支持二进制编码(事实上,基本任何编码)。在我们的例子中,我们最终在二进制字符串中的每个位置都有一个特征,所以它不是一个具有值 '011' 或 '010' 的特征,它的 3 分别具有 [0, 1, 1] 和 [0, 1, 0]。
在进行逻辑回归时,通常的做法是使用一个热向量作为期望的结果。所以,no of classes = no of nodes in output layer
。我们不使用词汇表中的单词索引(或一般的 class 数字),因为这可能会错误地指示两个 class 的接近度。但是为什么我们不能使用二进制数而不是单热向量呢?
即如果有 4 个 class,我们可以将每个 class 表示为 00,01,10,11,从而在输出层中产生 log(no of classes)
个节点。
用二进制编码就可以了。但是您可能需要根据您的任务和模型添加另一层(或过滤器)。因为由于二进制表示,您的编码现在涉及无效的共享功能。
例如,输入的二进制编码 (x = [x1, x2]
):
'apple' = [0, 0]
'orange' = [0, 1]
'table' = [1, 0]
'chair' = [1, 1]
表示orange
和chair
具有相同的特征x2
。现在预测两个 类 y
:
'fruit' = 0
'furniture' = 1
和标记数据样本的线性优化模型(W = [w1, w2]
和偏差 b
):
(argmin W) Loss = y - (w1 * x1 + w2 * x2 + b)
每当您将 chair
的 w2
权重更新为 furniture
时,您都会得到一个不受欢迎的更新,就好像将 orange
也预测为 furniture
一样。
在这种特殊情况下,如果您添加另一层 U = [u1, u2]
,您可能可以解决此问题:
(argmin U,W) Loss = y - (u1 * (w1 * x1 + w2 * x2 + b) +
u2 * (w1 * x1 + w2 * x2 + b) +
b2)
好的,为什么不通过使用单热编码来避免这种错误表示。 :)
https://github.com/scikit-learn-contrib/categorical-encoding
category_encoders 支持二进制编码(事实上,基本任何编码)。在我们的例子中,我们最终在二进制字符串中的每个位置都有一个特征,所以它不是一个具有值 '011' 或 '010' 的特征,它的 3 分别具有 [0, 1, 1] 和 [0, 1, 0]。