今天又是一个好日子,鏖战半夜三四点,在对感知机算法Perceptron algorithm进行正则化时候遇到一些小坑。
首先
Percepton对L2正则化中,学习率=1最后是可以不计入的,那么对“λ”来说,不是设置一个float就行。“λ”的维度必须和W权重维度一样。
1.第一个坑:TypeError: unsupported operand type(s) for -: 'list' and 'list'
reg=[0.001 for _ in range(n_feature)]
self._w = (constant-Regularization)*self._w + y[i] * X[i]
然后我就直接做减法了,就出现了以下作文
不能直接用 t=[…],这样建立的是 list 类型。 所以方法之一是引入 numpy 库。
Regularization = np.array(Regularization)
2.第二个坑:untimeWarning: overflow encountered in multiply
我直接他妈乘起来!
self._w = (constant-Regularization)*self._w + y[i] * X[i]
好家伙直接报错:untimeWarning: overflow encountered in multiply
重点:
self._w = (constant-Regularization)*self._w
这边的(constant-Regularization)我设置为了100
已经是矩阵乘矩阵了,为什么还会人工脑溢出呢?
原因:如果将矩阵a与作为元素的大数字相乘,则会引发异常
解决:可以通过修改调用函数的数组元素的类型来提高精度。
a = np.array(a, dtype=np.float128)
好了不报错了。
如何设置λ
•
将您的训练数据集分为训练和验证部分(例如80%-20%)
尝试使用不同的λ值(通常以对数标度),例如 λ= 10-5,10-4,10-3,10-2,10-1,1,0,101,102,103,104,105
•
验证数据。
为每个λ训练不同的分类模型,并选择在λ上具有最佳性能(例如准确性)的值
这个坑就坑在,一开始正则化系数为0.01,并不会报错,但是一旦达到100,就会引发异常。