0


最小平方误差算法

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. 𝐵(𝑘+1)=𝐵(𝑘)+𝑐[𝑒(𝑘)+|𝑒(𝑘)|]

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

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

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

1.2.2 向量的范数:

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

1.3 手动推演

1.4 流程图

1.5 主要程序代码

(1)Python代码实现

  1. import numpy as np
  2. def simm(e):
  3. L=len(e)
  4. flag=0
  5. s=0
  6. for k in e:
  7. if(k<0):
  8. s+=1
  9. if s==L:
  10. flag=1
  11. return flag
  12. "步骤一:规范化样本增广矩阵"
  13. w1 = np.array([[0, 0,1], [1,1,1]])
  14. w2 = np.array([[0,-1,-1], [-1,0,-1]])
  15. "步骤二,求伪逆矩阵"
  16. X = np.concatenate((w1, w2), axis=0) #将两个矩阵合并在一起
  17. #print(X)
  18. wn=np.matmul(np.linalg.inv(np.matmul(X.transpose(), X)), X.transpose())#伪逆矩阵
  19. "步骤三,设置初始值,求w1"
  20. b = np.array([1,1,1,1])
  21. c = 1
  22. w = np.matmul(wn,b)
  23. #w1
  24. e = np.matmul(X,w) - b
  25. "步骤四,步骤五,循环,判别"
  26. i=0
  27. if simm(e)==1:
  28. print('线性不可分')
  29. elif np.linalg.norm(e) > 0:
  30. while np.linalg.norm(e) > 0.001:
  31. dkh = e + abs(e)
  32. b = b + c * dkh
  33. w = w + c * np.matmul(wn, dkh)
  34. e = np.matmul(X, w) - b
  35. if simm(e) == 1:
  36. print('线性不可分')
  37. i += 1
  38. print(wn, '\n','\n', w, '\n','\n', e)
  39. elif np.linalg.norm(e) == 0:
  40. print('线性可分,解出w,算法结束')
  41. print("第%d次迭代满足条件"%i)

2Matlab代码实现

  1. %规范化增广样本矩阵
  2. 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];
  3. B=[1;1;1;1;1;1;1;1];%设置B(1)的初值
  4. C=1;%计算C的初值
  5. %求x的伪逆矩阵
  6. x1=inv(x'*x);%计算x的转置乘以x然后求逆矩阵,结果为x1
  7. xh=x1*x';%x1乘以x的转置得到xh,也就是x的伪逆矩阵
  8. %求w1
  9. w = xh*B;
  10. e = x*w - B;%计算e(1)
  11. disp(w);%输出数组w
  12. %对e(k)进行判别
  13. i=1;
  14. while(norm(e)>0.01)
  15. if e<0
  16. fprintf('线性不可分无解');
  17. break;
  18. end
  19. if e==0
  20. fprintf('线性可分');
  21. break;
  22. end
  23. w=w+C*xh*abs(e);
  24. B=B+C*(e+abs(e));
  25. e=x*w-B;
  26. i=i+1;
  27. fprintf('第%i次迭代的结果w:\n',i);
  28. disp(w);
  29. end

1.6 运行结果及分析

(1)Python代码结果

(2)Matlab代码结果

(3)手动推演的结果

  1. 三种实现方式都近似得到: 𝑑(𝑥)=2𝑥12𝑥22𝑥3+1
  2. 故该题目的判别函数为𝑑(𝑥)=2𝑥12𝑥22𝑥3+1,两类的分界面为2𝑥12𝑥22𝑥3+1=0。将第一类的点带入判别公式,得到的值都大于0,将第二类的点带入判别公式,得到的值都小于0
标签: 大数据 python 算法

本文转载自: https://blog.csdn.net/a1233219/article/details/125647490
版权归原作者 小小蜗牛,大大梦想 所有, 如有侵权,请联系我们删除。

“最小平方误差算法”的评论:

还没有评论