使用LMS训练感知器模型用于双月亮数据蟒蛇

时间:2018-04-03 17:44:49

标签: python perceptron

我尝试使用LMS(最小均方)算法创建在线版本(非批处理)感知器模型。 LMS也被称为Adaline(我猜)。我使用双月数据集,包括-1(非0)和+1类训练:

Double Moon seems like that:

我从Haykin的书中实现了LMS的python代码:

LMS description from Haykin's Neural Networks and Learning Machines book :

我的python代码在

下面
# add 1 for bias
xtrain = np.column_stack(([float(1) for i in x],x))
weights = np.array([0.0 for k in range(len(np.transpose(xtrain)))])
#learning rate
lr = 0.01
epoch=100
def getlineer(weights,xi):
    y = dot(np.transpose(xi),weights)
    #y = np.sign(y)
    return y

for i in range(epoch):
    for k in range(len(xtrain)):
        y = getlineer(weights,xtrain[k])
        e = desired[k]-y;
        weights = weights + lr  * dot(xtrain[k],e)
        print(weights)

但是当我训练算法时,模型无法100%学习,错误/权重变得过高:

enter image description here

此外,我在第二纪元后得到了纳米值。 我怎样才能获得最佳重量?我的代码是错误的还是关于数据集?

我知道有一个最佳的重量可以分开100%的准确性。 例如,我添加了一些代码查找每个权重更新的准确性:

def getLMS(weights):
    e=0
    for i in range(100):
        for k in range(len(xtrain)):
            y = getlineer(weights,xtrain[k])
            e = desired[k]-y;
            weights = weights + lr  * dot(xtrain[k],e)
            xx = dot(xtrain,weights);
            tt= [np.sign(k) for k in xx]
            lens = len([i for i, j in zip(desired, tt) if i == j]) 
            if lens ==len(xtrain):
                print(lens,k,i,weights)
                return weights

我在19.迭代期间得到了100%的分离器重量。

非常感谢。

0 个答案:

没有答案