我从头开始编写了感知器算法,并将训练后获得的权重与训练 sklearn 感知器模型后获得的权重进行了比较。我相信即使 sklearn 模型也将权重和偏差初始化为零向量,并且我选择了学习率
eta0=1
来匹配我的感知器代码。 (注意:我的代码中的偏差是向量中的最后一项w_b
)
我的代码:
def perceptron(X_train, y_train):
#initialize weights as 0
w = np.zeros(len(X_train.columns))
b = 0
w_b = np.append(w, b)
while True:
misclassifications = 0
for X , Y in zip(X_train.values, y_train.values):
X_i = np.append(X, 1)
if Y*(np.dot(X_i,w_b)) <= 0:
w_b = w_b + Y*X_i
misclassifications += 1
if misclassifications == 0:
break
return w_b
w_b = perceptron(X_train, y_train)
结果:
[-3. 6.7 -1. ]
sklearn代码:
perceptron = Perceptron(max_iter=1000, eta0=1,random_state=42)
perceptron.fit(X_train, y_train)
print("weights are",perceptron.coef_)
print("bias is",perceptron.intercept_)
结果:
weights are [[-4.7 10.1]] bias is [-2.]
我期望重量相同,但事实并非如此。有什么线索可以解释为什么吗?