前不久刚接触了机器学习方面的知识,对于任何的事情的学习总有一个过程,从困难到容易,所以在这里就把自己的一点小心得给记录下来了。大神勿喷!!!!
这里主要就是讲解一下关于线性分类问题的处理。
一:训练数据的结构
训练数据有离散型,有数值型的,而这下面是自己在学习中进行的数据(数值型的)
上面这些就是部分的测试数据。。。。。。
二:实验过程
一:要求
对数据使用线性分类和决策树的方法对鸢尾花分别进行分类,进行实验比较、精度比较并写成报告
二、 实验思路
模型的建立:
(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(山鸢尾)为0,Iris 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);%训练集第五列为标记(已修改为0和1)
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.
精度上b中matlab自带函数更好些
五、实验结果图
六、参数数据
求得结果为
0.3120 -0.0178 -0.1678 0.2082 0.2594