机器学习之线性分类

        前不久刚接触了机器学习方面的知识,对于任何的事情的学习总有一个过程,从困难到容易,所以在这里就把自己的一点小心得给记录下来了。大神勿喷!!!!

        这里主要就是讲解一下关于线性分类问题的处理。

一:训练数据的结构

       训练数据有离散型,有数值型的,而这下面是自己在学习中进行的数据(数值型的)

       


     上面这些就是部分的测试数据。。。。。。

二:实验过程

   一:要求

   对数据使用线性分类和决策树的方法对鸢尾花分别进行分类,进行实验比较、精度比较并写成报告

 二、 实验思路

模型的建立:

(1) 此实验线性模型为:

      

(2误差

   

(3) 求导迭代

mygradient(1)=sum(delta)/m;          %θ0的求导,偏置项

mygradient(2)=sum(delta.*x(:,1))/m;%对θ1的求导,

mygradient(3)=sum(delta.*x(:,2))/m;%对θ2的求导

mygradient(4)=sum(delta.*x(:,3))/m;%对θ3的求导

mygradient(5)=sum(delta.*x(:,4))/m;%对θ4的求导

 

    %更新参数

    optTheta=optTheta-mygradient*study;%study为学习率

 

 算法实现(工具:Matlab

1. 将数据集作为训练集,Iris Setosa(山鸢尾)为0Iris Versicolour(杂色鸢尾)为1

2. 建立线性模型,和误差计算函数

3.读入训练集计算误差,并求参数的偏导,更新参数

4.用更新后的参数再次计算误差,重复直到误差收敛或迭代次数完成

 

关键函数代码

1.%模型函数,此函数用假设的参数θ代入计算,得到假设的预测结果hypothesis

function [res] = h_func(inputx,theta)

%线性回归模型

res=theta(1)+theta(2)*inputx(:,1)+theta(3)*inputx(:,2)+theta(4)*inputx(:,3)+theta(5)*inputx(:,4);

 

2.%代价函数,指出真实值和拟合值之间的距离,每次迭代保证cost function量减小

function [ jVal,mygradient ] = mycost(theta)

hua=load('Hua.txt');%载入训练集

 

x=hua(:,1:4);%训练集前四列为特征

y=hua(:,5);%训练集第五列为标记(已修改为01

m=size(x,1);%参数为1,返回矩阵的行数==即训练集个数

 

hypothesis = h_func(x,theta);%调用函数h_func得到预测值

delta = hypothesis - y;%误差

jVal=sum(delta.^2);%误差的平方,即代价

mygradient(1)=sum(delta)/m;        %θ0的求导,偏置项

mygradient(2)=sum(delta.*x(:,1))/m;%对θ1的求导,

mygradient(3)=sum(delta.*x(:,2))/m;%对θ2的求导

mygradient(4)=sum(delta.*x(:,3))/m;%对θ3的求导

mygradient(5)=sum(delta.*x(:,4))/m;%对θ4的求导

 

3.%主函数

function [theta]=mygradient(study)%参数为学习率,测试取0.03效果好

optTheta=[0.5,0,0,0,0];%初始化参数

 

i=0;%记录迭代次数

while(i<50000)

    i=i+1;

    [ jVal,mygradient ] = mycost(optTheta);

    %收敛条件

    if(jVal<0.797)

       break;

    end

    %更新参数

    optTheta=optTheta-mygradient*study;%study为学习率

end

theta=optTheta';%转置,把数组转化为列向量了

  disp(['迭代了 ',num2str(i),'']);

  disp(['误差为 ',num2str(jVal)]);

四、实比较

a.使用学习效率为0.03,收敛条件是总误差小于0.797,迭代条件为50000

 

结果未收敛,迭代了50000

 

b.使用matlab自带函数fminunc,使用方法:

  [optTheta,functionVal,exitFlag] = fminunc(@costFunction2,initialTheta,options);

 

 

精度比较

 

读入一个测试集,使用两种参数计算总误差

a.


      

b.

 

 

精度上bmatlab自带函数更好些

 

 

五、实验结果图

 

 

六、参数数据

 

求得结果为 

  0.3120  -0.0178  -0.1678  0.2082  0.2594

 

  

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值