我的感知器和 sklearn 感知器的区别

问题描述 投票:0回答:1

我从头开始编写了感知器算法,并将训练后获得的权重与训练 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.]

我期望重量相同,但事实并非如此。有什么线索可以解释为什么吗?

python machine-learning scikit-learn neural-network perceptron
1个回答
0
投票
  1. 使用“random_state”意味着随机的事情正在发生。与您的自定义实现不同,sklearn 默认情况下会打乱您的训练数据。
  2. 收敛:将“max_iter”设置为 1000,以便权重调整 1000 次。但是,一旦没有错误分类,您的自定义实现将停止调整权重。
  3. 您的实际数据。真的有线性关系吗?这也很重要。
  4. 您使用了完全相同的训练数据和测试数据吗?
© www.soinside.com 2019 - 2024. All rights reserved.