Python实现最小均方算法(lms)

lms算法跟Rosenblatt感知器相比,主要区别就是权值修正方法不一样。lms采用的是批量修正算法,Rosenblatt感知器使用的

是单样本修正算法。两种算法都是单层感知器,也只适用于线性可分的情况。

详细代码及说明如下:

‘‘‘
   算法:最小均方算法(lms)
   均方误差:样本预测输出值与实际输出值之差平方的期望值,记为MES
   设:observed 为样本真值,predicted为样本预测值,则计算公式:
   (转换为容易书写的方式,非数学标准写法,因为数学符号在这里不好写)
   MES=[(observed[0]-pridicted[0])*(observed[0]-pridicted[0])+....
         (observed[n]-pridicted[n])*(observed[n]-pridicted[n])]/n‘‘‘‘‘‘
   变量约定:大写表示矩阵或数组,小写表示数字
   X:表示数组或者矩阵
   x:表示对应数组或矩阵的某个值‘‘‘‘‘‘
     关于学习效率(也叫步长:控制着第n次迭代中作用于权值向量的调节)。(下面的参数a):
     学习效率过大:收敛速度提高,稳定性降低,即出结果快,但是结果准确性较差
     学习效率过小:稳定性提高,收敛速度降低,即出结果慢,准确性高,耗费资源
     对于学习效率的确定,有专门的算法,这里不做研究。仅仅按照大多数情况下的选择:折中值‘‘‘import numpy as np
a=0.1  ##学习率 0<a<1X=np.array([[1,1],[1,0],[0,1],[0,0]]) ##输入矩阵D=np.array([1,1,1,0])  ##期望输出结果矩阵W=np.array([0,0])   ##权重向量expect_e=0.005 ##期望误差maxtrycount=20 ##最大尝试次数##硬限幅函数(即标准,这个比较简单:输入v大于0,返回1.小于等于0返回-1)‘‘‘
    最后的权重为W([0.1,0.1]),则:0.1x+0.1y=0 ==>y=-x
    即:分类线方程为:y=-x‘‘‘def sgn(v):    if v>0:        return 1    else:        return 0 ##跟上篇感知器单样本训练的-1比调整成了0,为了测试需要。-1训练不出结果
    ##读取实际输出   ‘‘‘
    这里是两个向量相乘,对应的数学公式:
    a(m,n)*b(p,q)=m*p+n*q
    在下面的函数中,当循环中xn=1时(此时W=([0.1,0.1])):
    np.dot(W.T,x)=(1,1)*(0.1,0.1)=1*0.1+1*0.1=0.2>0 ==>sgn 返回1‘‘‘def get_v(W,x):    return sgn(np.dot(W.T,x))##dot表示两个矩阵相乘##读取误差值def get_e(W,x,d):    return d-get_v(W,x)##权重计算函数(批量修正)‘‘‘
  对应数学公式: w(n+1)=w(n)+a*x(n)*e
  对应下列变量的解释:
  w(n+1) <= neww 的返回值
  w(n)   <=oldw(旧的权重向量)
  a      <= a(学习率,范围:0<a<1)
  x(n)   <= x(输入值)
  e      <= 误差值或者误差信号‘‘‘def neww(oldW,d,x,a):
    e=get_e(oldW,x,d)    return (oldW+a*x*e,e)##修正权值‘‘‘
    此循环的原理:
    权值修正原理(批量修正)==>神经网络每次读入一个样本,进行修正,
        达到预期误差值或者最大尝试次数结束,修正过程结束   
‘‘‘cnt=0while True:
    err=0
    i=0    for xn in X:        
        W,e=neww(W,D[i],xn,a)
        i+=1
        err+=pow(e,2)  ##lms算法的核心步骤,即:MES
    err/=float(i)
    cnt+=1    print(u"第 %d 次调整后的权值:"%cnt)    print(W)    print(u"误差:%f"%err)    if err<expect_e or cnt>=maxtrycount:        breakprint("最后的权值:",W.T)##输出结果print("开始验证结果...")for xn in X:    print("D%s and W%s =>%d"%(xn,W.T,get_v(W,xn)))##测试准确性:‘‘‘
   由上面的说明可知:分类线方程为y=-x,从坐标轴上可以看出:
   (2,3)属于+1分类,(-2,-1)属于0分类‘‘‘print("开始测试...")
test=np.array([2,3])print("D%s and W%s =>%d"%(test,W.T,get_v(W,test)))
test=np.array([-2,-1])print("D%s and W%s =>%d"%(test,W.T,get_v(W,test)))

输出结果:

第 1 次调整后的权值:
[ 0.1  0.1]
误差:0.250000
第 2 次调整后的权值:
[ 0.1  0.1]
误差:0.000000
最后的权值: [ 0.1  0.1]
开始验证结果...
D[1 1] and W[ 0.1  0.1] =>1
D[1 0] and W[ 0.1  0.1] =>1
D[0 1] and W[ 0.1  0.1] =>1
D[0 0] and W[ 0.1  0.1] =>0
开始测试...
D[2 3] and W[ 0.1  0.1] =>1
D[-2 -1] and W[ 0.1  0.1] =>0

从结果看出,经过2次训练,就得出了最优结果。

补充说明:经过多次调整样本或者权重,在20次循环中有时候出结果,有时候找不到最优解。所以在实验过程中,没有达到

预期结果,除了循环次数不够之外,最大的可能就是样本或者权值设置的问题。

时间: 2024-10-12 14:39:32

Python实现最小均方算法(lms)的相关文章

Levenshein distance最小编辑距离算法实现

Levenshein distance,中文名为最小编辑距离,其目的是找出两个字符串之间需要改动多少个字符后变成一致.该算法使用了动态规划的算法策略,该问题具备最优子结构,最小编辑距离包含子最小编辑距离,有下列的公式. 其中d[i-1,j]+1代表字符串s2插入一个字母,d[i,j-1]+1代表字符串s1删除一个字母,然后当xi=yj时,不需要代价,所以和上一步d[i-1,j-1]代价相同,否则+1,接着d[i,j]是以上三者中最小的一项. 算法实现(Python): 假设两个字符串分别为s1,

如何用Python实现常见机器学习算法-1

最近在GitHub上学习了有关python实现常见机器学习算法 目录 一.线性回归 1.代价函数 2.梯度下降算法 3.均值归一化 4.最终运行结果 5.使用scikit-learn库中的线性模型实现 二.逻辑回归 1.代价函数 2.梯度 3.正则化 4.S型函数 5.映射为多项式 6.使用的优化方法 7.运行结果 8.使用scikit-learn库中的逻辑回归模型实现 逻辑回归_手写数字识别_OneVsAll 1.随机显示100个数字 2.OneVsAll 3.手写数字识别 4.预测 5.运行

Python实现八大排序算法

Python实现八大排序算法,具体内容如下 1.插入排序描述 插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一个新的.个数加一的有序数据,算法适用于少量数据的排序,时间复杂度为O(n^2).是稳定的排序方法.插入算法把要排序的数组分成两部分:第一部分包含了这个数组的所有元素,但将最后一个元素除外(让数组多一个空间才有插入的位置),而第二部分就只包含这一个元素(即待插入元素).在第一部分排序完成后,再将这个最后元素插入到已排好序的第一部分中. 代码实现 def insert

Python实现各种排序算法的代码示例总结

Python实现各种排序算法的代码示例总结 作者:Donald Knuth 字体:[增加 减小] 类型:转载 时间:2015-12-11我要评论 这篇文章主要介绍了Python实现各种排序算法的代码示例总结,其实Python是非常好的算法入门学习时的配套高级语言,需要的朋友可以参考下 在Python实践中,我们往往遇到排序问题,比如在对搜索结果打分的排序(没有排序就没有Google等搜索引擎的存在),当然,这样的例子数不胜数.<数据结构>也会花大量篇幅讲解排序.之前一段时间,由于需要,我复习了

【机器学习算法-python实现】采样算法的简单实现

1.背景 采样算法是机器学习中比较常用,也比较容易实现的(出去分层采样).常用的采样算法有以下几种(来自百度知道): 一.单纯随机抽样(simple random sampling) 将调查总体全部观察单位编号,再用抽签法或随机数字表随机抽取部分观察单位组成样本. 优点:操作简单,均数.率及相应的标准误计算简单. 缺点:总体较大时,难以一一编号. 二.系统抽样(systematic sampling) 又称机械抽样.等距抽样,即先将总体的观察单位按某一顺序号分成n个部分,再从第一部分随机抽取第k

max-min fairness 最大最小公平算法

我们总会面临这样的问题,需要给一组用户分配一些稀缺资源,站在资源分配者的角度,他们具有等价的权利获取资源,但实际上,一些用户可能获取较少的资源就能够满足需要,这样看来,他们对资源的获取又不是完全等价的,似乎不适合去平分资源,因此就有了最大最小公平算法. 最大最小公平算法定义如下(不带权):      1.资源按照需求递增的顺序进行分配:      2.不存在用户获得的资源超过自身的需求::      3.对于未满足的用户,等价分享剩余资源: 算法实现逻辑(不带权): 首先假定用户集合有n个用户,

序列最小最优化算法(SMO)-SVM的求解(续)

在前一篇文章中,我们给出了感知器和逻辑回归的求解,还将SVM算法的求解推导到了最后一步,在这篇文章里面,我们将给出最后一步的求解.也就是我们接下来要介绍的序列最小最优化算法. 序列最小最优化算法(SMO): 首先回顾一下.我们使用广义拉格朗日函数,将目标函数和限制条件写到一起,然后证明了原始问题能够转化成对偶问题来求解.并且使用KKT条件将对偶问题化简,得到下面的问题(以非线性可分SVM的研究问题作为例子,求解): $\max \limits_{a} \ -\frac{1}{2}\sum_{i=

POJ 2914 Minimum Cut 最小割算法题解

最标准的最小割算法应用题目. 核心思想就是缩边:先缩小最大的边,然后缩小次大的边,依此缩小 基础算法:Prime最小生成树算法 不过本题测试的数据好像怪怪的,同样的算法时间运行会差别很大,而且一样的代码替换,居然会WA.系统出错的几率很小,难倒测试系统本题会有错误? 懒得继续测试这道题的系统了,反正算法正确,AC. #include <stdio.h> #include <string.h> #include <limits.h> const int MAX_N = 5

利用Python实现 队列的算法

以下内容都是来自"悟空"大神的讲解,听他的视频课,利用Python实现堆栈的算法,自己做了一些小总结,可能会存在自己理解的一些误区, 1.栈的实现 队列的特征是先进先出,同我们生活中的队列具有相同的特性:先排队的先办事.队列的应用场景非常多,例如消息通信.多进程间的协同.多线程间的协同等. 在算法前,我们需要先知道3个值  1.节点(节点作用是 进行一个指针(假设的)一个指向  2.就是现在这个位置上的元素的值)  2.还需要知道一个头,一个尾,就如上面两个一个head,就对应下面的代