今天尝试写了一下逻辑回归分类,把代码分享给大家,至于原理的的话请戳这里 https://blog.csdn.net/laobai1015/article/details/78113214   (在这片博客的基础上我加了一丢丢东西)。

用到的预测函数

其中,h为预测函数(大于0.5为一类,小于等于0.5为另一类)。θ为各个特征的参数。θ=[θ1,θ2,θ3…]T

损失函数J(θ)

 

利用梯度下降算法进行参数的更新公式如下:

其中,α是学习率参数,λ是正则项参数,需要自己输入。

用上述三个公式即可写出一般情况下的逻辑回归分类,经试验,其分类效果在我的测试数据下有90%以上准确度。

以下代码为了演示方面,只提供了两个特征值,然后加了一个常数项(经过实验,常数项是不可缺少的)。大家在使用自己的数据集的话只需要进行一点小改动即可。

matlab代码如下:

  1. clear
  2. clc
  3.  
  4. %% 数据准备
  5. %X = xlsread(\'C:\Users\user01\Desktop\test.xlsx\');
  6. %二分类 随机生成数据。 200个数据 每个数据2个特征
  7. data=1*rand(300,2);
  8. label=zeros(300,1);
  9. %label(sqrt(data(:,1).^2+data(:,2).^2)<8)=1;
  10. label((data(:,2)+data(:,1)>1))=1;
  11. %在data上加常数特征项;
  12. data=[data,ones(size(data,1),1)];
  13.  
  14. %打乱循序
  15. randIndex = randperm(size(data,1));
  16. data_new=data(randIndex,:);
  17. label_new=label(randIndex,:);
  18.  
  19. %80%训练 20%测试
  20. k=0.8*size(data,1);
  21. X1=data_new(1:k,:);
  22. Y1=label_new(1:k,:);
  23. X2=data_new(k+1:end,:);
  24. Y2=label_new(k+1:end,:);
  25.  
  26. [m1,n1] = size(X1);
  27. [m2,n2] = size(X2);
  28. Features=size(data,2); %特征个数
  29. %% 开始训练
  30. %设定学习率为0.01
  31. delta=1;
  32. lamda=0.2; %正则项系数
  33.  
  34. theta1=rand(1,Features);
  35. %theta1=[.5,.5];
  36. %%训练模型
  37.  
  38. %梯度下降算法求解theta(每次都是对全部的数据进行训练)
  39. num = 300; %最大迭代次数
  40. L=[];
  41. while(num)
  42. dt=zeros(1,Features);
  43. loss=0;
  44. for i=1:m1
  45. xx=X1(i,1:Features);
  46. yy=Y1(i,1);
  47. h=1/(1+exp(-(theta1 * xx\')));
  48. dt=dt+(h-yy) * xx;
  49. loss=loss+ yy*log(h)+(1-yy)*log(1-h);
  50. end
  51. loss=-loss/m1;
  52. L=[L,loss];
  53. theta2=theta1 - delta*dt/m1 - lamda*theta1/m1;
  54. theta1=theta2;
  55. num = num - 1;
  56. if loss<0.01
  57. break;
  58. end
  59. end
  60. figure
  61. subplot(1,2,1)
  62. plot(L)
  63. title(\'loss\')
  64.  
  65. subplot(1,2,2)
  66. x=0:0.1:10;
  67. y=(-theta1(1)*x-theta1(3))/theta1(2);
  68. plot(x,y,\'linewidth\',2)
  69. hold on
  70. plot(data(label==1,1),data(label==1,2),\'ro\')
  71. hold on
  72. plot(data(label==0,1),data(label==0,2),\'go\')
  73. axis([0 1 0 1])
  74.  
  75.  
  76. %测试数据
  77. acc=0;
  78. for i=1:m2
  79. xx=X2(i,1:Features)\';
  80. yy=Y2(i);
  81. finil=1/(1+exp(-theta2 * xx));
  82. if finil>0.5 && yy==1
  83. acc=acc+1;
  84. end
  85. if finil<=0.5 && yy==0
  86. acc=acc+1;
  87. end
  88. end
  89. acc/m2
  90.  
  91. %测试结果: 测试准确率为95%。

  

 得到的loss曲线为:

 

分类图像为:

 

版权声明:本文为hyb965149985原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/hyb965149985/p/10601418.html