使用感知器算法得到不一致的结果

我在尝试实现感知器算法,但得到的结果不一致;我注意到权重的初始化对结果有很大影响。我是否有什么明显的错误?谢谢!

import numpy as np
def train(x,y):
    lenWeights = len(x[1,:]);
    weights = np.random.uniform(-1,1,size=lenWeights)
    bias = np.random.uniform(-1,1);
    learningRate = 0.01;
    t = 1;
    converged = False;
    # 感知器算法
    while not converged and t < 100000:
        targets = [];
        for i in range(len(x)):
            # 计算网络输出
            output = ( np.dot(x[i,:],weights) ) + bias;
            # 感知器阈值决策
            if (output > 0):
                target = 1;
            else:
                target = 0;
            # 计算误差并更新权重
            error = target - y[i];
            weights = weights + (x[i,:] * (learningRate * error) );
            bias = bias + (learningRate * error);
            targets.append(target);
            t = t + 1;
        if ( list(y) == list(targets) ) == True:
            converged = True;
    return weights,bias
def test(weights, bias, x):
    predictions = [];
    for i in range(len(x)):
        # 计算 w'x + b
        output = ( np.dot(x[i,:],weights) ) + bias;
        # 从硬限制函数获取决策
        if (output > 0):
            target = 1;
        else:
            target = 0;
        predictions.append(target);
    return predictions
if __name__ == '__main__':
    # 简单测试
    x = np.array( [  [0,1], [1,1] ] );
    y = np.array( [ 0, 1 ] );
    weights,bias = train(x,y);
    predictions = test(weights,bias,x);
    print predictions
    print y

回答:

感知器不是全局优化的,因此训练结果不会一致(每次运行算法时结果可能不同),这取决于(包括但不限于)权重的初始化。这是非凸函数梯度优化的特性(训练感知器就是一个例子),而不是实现问题。

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注