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

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

一:训练数据的结构

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

       


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

二:实验过程

   一:要求

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

 二、 实验思路

模型的建立:

(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

 

  

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐