最小平方误差算法

这篇具有很好参考价值的文章主要介绍了最小平方误差算法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.1 题目的主要研究内容

(1)用LMSE算法求下列模式分类的解向量w

最小平方误差算法

最小平方误差算法

(2)制造PPT,并讲解。

1.2 题目研究的工作基础

1.2.1  LMSE算法步骤:

(1)根据N个分属于两类的样本,写出规范化增广样本矩阵X;

(2)求X的伪逆矩阵X#=(XTX)-1XT;

(3)设置初值c和B(1),c为正的校正增量,B(1)的各分量大于零,迭代次数k=1。

开始迭代:计算 最小平方误差算法 最小平方误差算法

(4)计算𝒆(𝒌)=𝑿𝑾(𝒌)−𝑩(𝒌),进行可分性判别。

  如果e(k)=0,线性可分,解为W(k),算法结束;

  如果e(k)>0,线性可分,若进入(5)可使𝒆(𝒌)→𝟎,得最优解;

  如果e(k)<0,线性不可分,停止迭代,无解,算法结束。

  否则,说明e(k)的各分量值有正有负,进入(5)。

(5)计算W(K+1)和B(K+1)。

方法1:分别计算𝑊(𝑘+1)=𝑊(𝑘)+𝑐𝑋#|𝑒(𝑘)|

               𝐵(𝑘+1)=𝐵(𝑘)+𝑐[𝑒(𝑘)+|𝑒(𝑘)|]

方法2:先计算𝐵(𝑘+1)=𝐵(𝑘)+𝑐[𝑒(𝑘)+|𝑒(𝑘)|]

               再计算𝑊(𝑘+1)=𝑋#𝐵(𝑘+1)

  迭代次数k加1,返回(4)

1.2.2 向量的范数:

最小平方误差算法

        我们利用向量的范数,对迭代停止的条件进行判断,这三种范数都是可以的。下面手动推演和程序实现均采用二范数,即欧式范数对迭代是否停止进行判断。

1.3 手动推演

最小平方误差算法

最小平方误差算法

最小平方误差算法

1.4 流程图

最小平方误差算法

1.5 主要程序代码

(1)Python代码实现

import numpy as np
def simm(e):
    L=len(e)
    flag=0
    s=0
    for k in e:
        if(k<0):
            s+=1
    if s==L:
        flag=1
    return flag
"步骤一:规范化样本增广矩阵"
w1 = np.array([[0, 0,1], [1,1,1]])
w2 = np.array([[0,-1,-1], [-1,0,-1]])
"步骤二,求伪逆矩阵"
X = np.concatenate((w1, w2), axis=0) #将两个矩阵合并在一起
#print(X)
wn=np.matmul(np.linalg.inv(np.matmul(X.transpose(), X)), X.transpose())#伪逆矩阵
"步骤三,设置初始值,求w1"
b = np.array([1,1,1,1])
c = 1
w = np.matmul(wn,b)
#w1
e = np.matmul(X,w) - b
"步骤四,步骤五,循环,判别"
i=0
if simm(e)==1:
  print('线性不可分')
elif np.linalg.norm(e) > 0:
    while np.linalg.norm(e) > 0.001:
        dkh = e + abs(e)
        b = b + c * dkh
        w = w + c * np.matmul(wn, dkh)
        e = np.matmul(X, w) - b
        if simm(e) == 1:
            print('线性不可分')
        i += 1
print(wn, '\n','\n', w, '\n','\n', e)
elif np.linalg.norm(e) == 0:
    print('线性可分,解出w,算法结束')
print("第%d次迭代满足条件"%i)

(2)Matlab代码实现

%规范化增广样本矩阵
x=[0 0 0 1;1 0 0 1;1 0 1 1;1 1 0 1;0 0 -1 -1;0 -1 -1 -1;0 -1 0 -1;-1 -1 -1 -1];
B=[1;1;1;1;1;1;1;1];%设置B(1)的初值
C=1;%计算C的初值
%求x的伪逆矩阵
x1=inv(x'*x);%计算x的转置乘以x然后求逆矩阵,结果为x1
xh=x1*x';%x1乘以x的转置得到xh,也就是x的伪逆矩阵
%求w1
w = xh*B;
e = x*w - B;%计算e(1)
disp(w);%输出数组w
%对e(k)进行判别
i=1;
while(norm(e)>0.01)
     if e<0
         fprintf('线性不可分无解');
         break;
     end
     if e==0
         fprintf('线性可分');
         break;
     end
     w=w+C*xh*abs(e);
     B=B+C*(e+abs(e));
     e=x*w-B;
     i=i+1;
     fprintf('第%i次迭代的结果w:\n',i);
     disp(w);
end

1.6 运行结果及分析

(1)Python代码结果

最小平方误差算法

(2)Matlab代码结果

最小平方误差算法

 (3)手动推演的结果

最小平方误差算法

        三种实现方式都近似得到: 𝑑(𝑥)=2𝑥1−2𝑥2−2𝑥3+1

        故该题目的判别函数为𝑑(𝑥)=2𝑥1−2𝑥2−2𝑥3+1,两类的分界面为2𝑥1−2𝑥2−2𝑥3+1=0。将第一类的点带入判别公式,得到的值都大于0,将第二类的点带入判别公式,得到的值都小于0。文章来源地址https://www.toymoban.com/news/detail-426856.html

到了这里,关于最小平方误差算法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包