博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
学习总结:机器学习(六)
阅读量:5067 次
发布时间:2019-06-12

本文共 2242 字,大约阅读时间需要 7 分钟。

逻辑回归(Logistic regression)

  前面几篇文章都是在讨论回归问题,从这一部分开始,过渡到分类问题。第一篇文章中曾经写过:如果输出值为连续值,则可归为回归问题;如果输出值为若干离散值,则为分类问题。

  从最简单的问题开始,我们假设输出值y只有两个值{0,1}。这时,如果用线性回归,我们很难找到符合要求的线性函数,于是,采用另一种回归——逻辑回归。

  在线性回归中,我们假设其“规律”为一个线性函数:

            

  而在逻辑回归中,我们假设其“规律”为一个逻辑函数:

            

      其中,

            

      称为逻辑函数sigmoid函数

   逻辑函数的图形如下:

      

  这是一条很优美的s型曲线,z大于0,g(z)大于0.5,z小于0,g(z)小于0.5;z趋于无穷大时,g(z)趋近于1,z趋于无穷小时,g(z)趋近于0.

  另外,逻辑函数的导数有如下性质:

        

  接下来,我们开始将概率方面的东西引入逻辑回归。P(y = 1 | x; θ)表示:当θ确定时,输入为x时,输出y可能为1的概率。不妨假设:

          

  根据上面的假设,可以以更紧凑的方式写出输出y的概率密度函数

          

  如果训练集中每一个样本都是独立生成的,那就可以得到似然函数的表达式:

          

  所谓似然函数,可以这么理解:对于某一个θ,训练集是X时,输出为y的可能性有多大。怎样衡量可能性呢?这里是通过计算每一个训练样本的输出可能为目标值的概率,然后再将所有样本的这些概率相乘。

  我们的目的,自然是找到一个θ,使似然函数取得最大值。与线性回归类似,我们可以采用梯度上升的方法来获取θ:  (注意:梯度上升方法是用“+”,而梯度下降方法用“-”)

  对于一个训练样本,有:

          

  l(θ)是似然函数的对数形式:l(θ)=logL(θ).由此,可以得到更新策略:

          

  它与随机梯度下降算法很相似。

  思考:1.为什么要假设P(y = 1 | x; θ) = hθ(x)?

  我的答案:hθ(x) = g(θTx) 是输入为x时,对输出的一种假设。这里还有一层隐含的含义:θTx实际上是对样本的一种线性划分。若θTx<0,则表示将x划分到输出为y=0那一类,此时P(y = 1 | x; θ)自然应该较小;若θTx>0,则表示将x划分到输出为y=1那一类,此时P(y = 1 | x; θ)自然应该较大。而sigmoid函数完全符合这一映射要求。

  2.讲义上的问题:上面得到的更新策略与随机梯度下降算法很相似,但它却是与线性回归完全不同的概念,为什么会出现这种情况?

  我的答案:线性回归是调整θ,使得hθ(x)符合样本的固有规律;而逻辑回归则相反,它是对样本点进行一个映射,使得映射后的样本点分布符合sigmoid函数的规律。但它们的相同点是,都有一个渐进逼近的过程,所以产生的更新策略会很相似。

 

  matlab代码如下:

 

%logicRegressionTrain function is used to train samples using logic

%regression.
%FEATURE is the features of the samples.
%VALUE is the output of the samples.
%THETA is parameter of the hypotheses.
function [theta] = logicRegressionTrain(feature,value)
length = size(feature,2);
num = size(feature,1);
features = [ones(num,1) feature];
theta = zeros(length + 1,1);
alpha = 0.005/(num*10);
%theta = 1 + rand(1,length + 1);
for i = 1:100000;
delta = value - h_func(features,theta);
% costvalue = delta'*delta;
% if costvalue < 1e-10;
% display 'break the if condition'
% break;
% end
theta = theta + alpha*features'*delta;
% theta(1) = theta(1) + alpha*sum(delta.*features(:,1));
% theta(2) = theta(2) + alpha*sum(delta.*features(:,2));
end
theta = theta/theta(1);
end

 

function [hypVal] = h_func(features,theta)

rate = features*theta;
hypVal = 1./(1 + exp(-rate));
end

转载于:https://www.cnblogs.com/guobiao819/p/logistic_regression.html

你可能感兴趣的文章
iOS 数组排序
查看>>
第三节
查看>>
PHP结合MYSQL记录结果分页呈现(比较实用)
查看>>
Mysql支持的数据类型
查看>>
openSuse beginner
查看>>
Codeforces 620E(线段树+dfs序+状态压缩)
查看>>
Windows7中双击py文件运行程序
查看>>
Market entry case
查看>>
css3动画属性
查看>>
Mongodb 基本命令
查看>>
控制文件的备份与恢复
查看>>
软件目录结构规范
查看>>
mysqladmin
查看>>
解决 No Entity Framework provider found for the ADO.NET provider
查看>>
设置虚拟机虚拟机中fedora上网配置-bridge连接方式(图解)
查看>>
[置顶] Android仿人人客户端(v5.7.1)——人人授权访问界面
查看>>
ES6内置方法find 和 filter的区别在哪
查看>>
Android实现 ScrollView + ListView无滚动条滚动
查看>>
java学习笔记之String类
查看>>
UVA 11082 Matrix Decompressing 矩阵解压(最大流,经典)
查看>>