对数几率回归模型是处理分类问题的算法,常用于垃圾邮件分类,天气预测等,很多文献也将其称为“逻辑回归”。这里我采用西瓜书的西瓜数据集3.0a来进行分类。 这是一个二分类问题,其输出的标记y属于{0,1},而线性回归模型产生的预测值是实值,于是我们需要将实值转换为0/1值,最理想的是单位阶跃函数。但是单位阶跃函数不连续,因此不能直接使用它。于是我们希望找到在一定程度上近似单位阶跃函数的‘替代函数’,并希望它单调可微,对数几率函数(它是一种sigmoid函数)正是这样一个替代函数。
其大致图形如下: 他将z值转换为一个接近0或1的y值,并且在z=0附近变化很陡。
这种分类学习方法直接对分类可能性进行建模,无需事先假设数据分布,避免了假设分布不准确带来的问题; 它能得到近似概率预测,这对需要利用概率辅助决策的任务很有用; 对率函数是任意阶可导的凸函数,有很好的数学性质,许多数值优化算法都可直接用于求解最优解。
以上就是对率回归的基本思想。 但是我们用matlab来实现的话就非常的简单,不用梯度下降法就能轻松的算出来,因为matlab当中有很多求解这样最优参数的函数。我们的目的就是求出满足(1.13)式的beta。将(1.13)写成具体的矩阵形式 我们现在需要注意的一个原则就是能用矩阵就不用了循环,因为循环非常耗费时间。然后我们用matlab的fminsearch函数就可以算出beta和b了。
新建一个文件夹为对数几率,在这个文件夹下创建train.m
D={1,0.697,0.46,'是' %数据集为%编号 密度 含糖率 好瓜 2,0.774,0.376,'是' % 1 0.697 0.46 是 3,0.634,0.264,'是' % 2 0.774 0.376 是 4,0.608,0.318,'是' 5,0.556,0.215,'是' 6,0.403,0.237,'是' 7,0.481,0.149,'是' 8,0.437,0.211,'是' 9,0.666,0.091,'否' 10,0.243,0.267,'否' 11,0.245,0.057,'否' 12,0.343,0.099,'否' 13,0.639,0.161,'否' 14,0.657,0.198,'否' 15,0.36,0.37,'否' 16,0.593,0.042,'否' 17,0.719,0.103,'否'}; X1=D(:,2); X2=D(:,3); % pos=[]; neg=[]; y = D(:, 4); for i=1:length(D) if strcmp(D{i,4},'是')==1 pos=[pos,i];%记录好瓜的序号 else neg=[neg,i];%记录坏瓜的序号 end end plot([X1{pos}],[X2{pos}],'*');hold on%好瓜 plot([X1{neg}],[X2{neg}],'o');hold on % Labels and Legend xlabel('密度'),ylabel('含糖率'),legend('好瓜','坏瓜') %% density=[]; sugar_rate=[]; for i=1:length(X1) density=[density,X1{i}];%X1为17×1 cell 数组,元素为{[0.6970],...} end %这里的目的是将其转换为1x17的double数组(矩阵) for i=1:length(X2) sugar_rate=[sugar_rate,X2{i}];%X2为17×1 cell 数组,元素为{[0.4600],...} end %这里的目的是将其转换为1x17的double数组(矩阵) Y=[]; for i=1:length(y) if strcmp(D{i,4},'是')==1 Y=[Y,1];%对标签进行数据化‘是’赋值为1 else Y=[Y,0];%对标签进行数据化‘否’赋值为0 end end m=length(density); X=[density;sugar_rate;ones(size(density))]; fun=@(b) -b*X*Y'+log(1+exp(b*X))*ones(m,1); B=fminsearch(fun,[0,0,0])%这里采用fminsearch函数来进行优化,只有三个参数w1 w2 b % X = FMINSEARCH(FUN,X0) starts at X0 and attempts to find a local minimizer % X of the function FUN. FUN is a function handle. FUN accepts input X and % returns a scalar function value F evaluated at X. X0 can be a scalar, vector % or matrix. x=[0:0.05:1.4]; plot(x,-B(1)/B(2)*x-B(3)/B(2))%画出分类的直线由于matlab里面没有sigmoid函数,所以自己写一个sigmoid函数,t同样在对数几率文件夹下新建文件sigmoid.m
function r=sigmoid(B,density,sugar_rate) r=B*[density;sugar_rate;1]; r=1/(1+exp(-r)); end运行结果为: