目录

  • Logistic 回归
    • 假设函数(Hypothesis Function)
    • 代价函数(损失函数)
    • 代码
    • 参考

Logistic 回归

有的翻译叫做逻辑回归,但我看很多人说这个名字不好,其实它和逻辑这个专有名词并没有必然的联系,所以这里采用李航博士《统计学习方法》中的翻译:逻辑斯谛回归。

对于二元分类问题来讲,给定一个输入特征向量 ܺX它可能对应一张图片,你想识别这 张图片识别看它是否是一只猫或者不是一只猫的图片,你想要一个算法能够输出预测,称之为y^,也就是你对实际值 y 的估计。更正式地来说,你想让 y^表示 y 等于 1 的一 种可能性或者是机会,条件是给定了输入特征 X。换句话来说,你想让 y^来告诉你这是一只猫的图片的机率有多大。

假设函数(Hypothesis Function)

我们用 w来表示逻辑回归的参数,这也是一个݊nx维向量(因为w实际上是特征权重,维度与特征向量相同),参数里面还有b,这是一个实数(表示偏差)。所以给出输入x以及参数w和 b之后,我们怎样产生输出预测值y,一件你可以尝试的事是让y=wTx+b。

这时候我们得到的是一个关于输入x的线性函数,实际上这是在做线性回归时所用到的,但是这对于二元分类问题来讲不是一个非常好的算法,因为你想让y^表示实际值y等于 1 的机率的话,y^应该在 0 到 1 之间。这是一个需要解决的问题,因为wTx+b可能比1要大得多,或者甚至为一个负值。对于你想要的在0和1之间的概率来说它是没有意义的,因此在logistic回归中,我们的输出应该是y^等于由上面得到的线性函数式子作为自变量的 sigmoid 函数中,公式如上图最下面所示,将线性函数转换为非线性函数。
关于z的 sigmoid 函数将会近似等于 1 除以 1 加上某个非常接近于 0 的项,因为e的指数如果是个绝对值很大的负数的话,这项将会接近于 0,所以如果z很大的话那么关于z的 sigmoid 函数会非常接近 1。相反地,如果z非常小或者说是一个绝对值很大的负数,你可以认为这是 1 除以 1 加上一个非常非常大的数,所以这个就接近于 0。因此当你实现logistic回归时,你的工作就是去让机器学习参数w以及 b, 这样才使得y^成为对 y=1这一情况的概率一个很好的估计。

代价函数(损失函数)

为了训练逻辑回归模型的参数w和参数b,我们需要一个代价函数,通过训练代价函数来得到参数w和参数b。先看一下逻辑斯谛回归的输出函数:

为了让模型通过学习调整参数,你需要给一个m样本的训练集,这会让你在训练集上找到参数w和参数b,来得到你的输出。
对训练集的预测值,我们将它写成y^,我们更希望它会接近于训练集中的y值,为了对 上面的公式更详细的介绍,我们需要说明上面的定义是对一个训练样本来说的,这种形式也使用于每个训练样本,我们使用这些带有圆括号的上标来区分索引和样本,训练样本i所对应的预测值是y(i),是用训练样本wTx(i)+b的,然后通过 sigmoid 函数来得到,也可以把z定义为z(i)=wTx(i)+b,我们将使用符号(i)注解,上标(i)来指明数据表示x或者y或者z 或者其他数据的第i个训练样本。

损失函数:

损失函数又叫做误差函数,用来衡量算法的运行情况,Loss function:L(y^,y)
我们通过这个L称为的损失函数,来衡量预测输出值和实际值有多接近。一般我们用预 测值和实际值的平方差或者它们平方差的一半,但是通常在逻辑回归中我们不这么做,因为当我们在学习逻辑斯谛回归参数的时候,会发现我们的优化目标不是凸优化,只能找到多个局部最优值,梯度下降法很可能找不到全局最优值,虽然平方差是一个不错的损失函数,但是我们在逻辑斯谛回归模型中会定义另外一个损失函数:

当我们使用平方误差作为损失函数的时候,你会想要让这个误差尽可能地小对于这个逻辑斯谛回归损失函数,我们也想让它尽可能地小。

当y = 1时损失函数y = -log(y),如果想要损失函数L尽可能得小,那么y就要尽可能大,因为 sigmoid函数取值[0,1],所以y^会无限接近于 1。
当y = 0时损失函数y = -log(1 - y),如果想要损失函数L尽可能得小,那么y就要尽可能小,因为sigmoid函数取值[0,1],所以y^会无限接近于0。

如果y等于 1,我们就尽可能让y^变大,如果y等于 0,我们就尽可能让y^变小。 损失函数是在单个训练样本中定义的,它衡量的是算法在单个训练样本中表现如何,为了衡量算法在全部训练样本上的表现如何,我们需要定义一个算法的代价函数,算法的代价函数是对m个样本的损失函数求和然后除以m:

损失函数只适用于像这样的单个训练样本,而代价函数是参数的总代价,所以在训练逻 辑斯谛回归模型时候,我们需要找到合适的w和b,来让代价函数J的总代价降到最低。 根据我们对逻辑斯谛回归算法的推导及对单个样本的损失函数的推导和针对算法所选用参数的总代价函数的推导,结果表明逻辑斯谛回归可以看做是一个非常小的神经网络。

代码

# encoding=utf-8
# @Author: WenDesi
# @Date:   08-11-16
# @Email:  wendesi@foxmail.com
# @Last modified by:   WenDesi
# @Last modified time: 08-11-16import time
import math
import random
import pandas as pd
from sklearn.cross_validation import train_test_split
from sklearn.metrics import accuracy_scoreclass LogisticRegression(object):def __init__(self):self.learning_step = 0.00001self.max_iteration = 5000def predict_(self,x):wx = sum([self.w[j] * x[j] for j in xrange(len(self.w))])exp_wx = math.exp(wx)predict1 = exp_wx / (1 + exp_wx)predict0 = 1 / (1 + exp_wx)if predict1 > predict0:return 1else:return 0def train(self,features, labels):self.w = [0.0] * (len(features[0]) + 1)correct_count = 0time = 0while time < self.max_iteration:index = random.randint(0, len(labels) - 1)x = list(features[index])x.append(1.0)y = labels[index]if y == self.predict_(x):correct_count += 1if correct_count > self.max_iteration:breakcontinue# print 'iterater times %d' % timetime += 1correct_count = 0wx = sum([self.w[i] * x[i] for i in xrange(len(self.w))])exp_wx = math.exp(wx)for i in xrange(len(self.w)):self.w[i] -= self.learning_step * \(-y * x[i] + float(x[i] * exp_wx) / float(1 + exp_wx))def predict(self,features):labels = []for feature in features:x = list(feature)x.append(1)labels.append(self.predict_(x))return labelsif __name__ == "__main__":print 'Start read data'time_1 = time.time()raw_data = pd.read_csv('../data/train_binary.csv',header=0)data = raw_data.valuesimgs = data[0::,1::]labels = data[::,0]# 选取数据的2/3作为训练集, 1/3 作为测试集train_features, test_features, train_labels, test_labels = train_test_split(imgs, labels, test_size=0.33, random_state=23323)time_2 = time.time()print 'read data cost ',time_2 - time_1,' second','\n'print 'Start training'lr = LogisticRegression()lr.train(train_features, train_labels)time_3 = time.time()print 'training cost ',time_3 - time_2,' second','\n'print 'Start predicting'test_predict = lr.predict(test_features)time_4 = time.time()print 'predicting cost ',time_4 - time_3,' second','\n'score = accuracy_score(test_labels,test_predict)print "The accruacy socre is ", score

参考

本文为吴恩达深度学习笔记,网易云课堂有他的正版免费课程。
[1]: https://mooc.study.163.com/smartSpec/detail/1001319001.htm
[2]: https://mooc.study.163.com/learn/2001281002?tid=2403023003&trace_c_p_k2=a648feca4e7447bea1f676540f337e6c#/learn/content?type=detail&id=2403362487
[3]: https://github.com/WenDesi/lihang_book_algorithm

Logistic Regression(逻辑斯谛回归)相关推荐

  1. 逻辑斯谛回归模型( Logistic Regression,LR) 最大熵模型(Max Entropy,ME)

    文章目录 1. Logistic Regression 模型 1.1 logistic 分布 1.2 二项逻辑斯谛回归模型 1.3 模型参数估计 1.4 多项逻辑斯谛回归 1.5 Python代码 2 ...

  2. 机器学习--逻辑斯谛回归(Logistic Regression)

    机器学习–逻辑斯谛回归(Logistic Regression) 基本概念 逻辑斯谛回归(Logistic Regression)虽然带回归,却是经典的分类方法.逻辑斯谛回归模型属于对数线性模型.它在 ...

  3. 在opencv3中实现机器学习之:利用逻辑斯谛回归(logistic regression)分类

    logistic regression,注意这个单词logistic ,并不是逻辑(logic)的意思,音译过来应该是逻辑斯谛回归,或者直接叫logistic回归,并不是什么逻辑回归.大部分人都叫成逻 ...

  4. 逻辑斯谛回归(Logistic Regression):函数、模型及其理论内涵

    逻辑斯谛回归(Logistic Regression)[又名逻辑回归,对率回归,对数几率回归]:函数.模型及其理论内涵 逻辑斯谛函数(logistic function)[即sigmoid函数]:函数 ...

  5. 逻辑回归解释 (Logistic Regression)

    文章目录 什么是逻辑回归算法? 可视化曲线python 代码 最大似然估计 梯度下降法 Python代码简单实现(批量梯度下降法) 优缺点 什么时候用 多分类 应用场景 总结 什么是逻辑回归算法? L ...

  6. 对数几率回归(Logistic Regression)分析与实践

    目录 1 对数几率回归原理分析 1.1 引入 1.2 损失函数 1.3  求最优解 2 对数几率回归实践 Logistic回归的一般过程 Logistic回归的优缺点 Logistic回归算法描述(改 ...

  7. 机器学习与高维信息检索 - Note 3 - 逻辑回归(Logistic Regression)及相关实例

    逻辑回归 Logistic Regression 3. 逻辑回归 补充: 凸性 Convexity 定义3.1 定理3.2 定理3.3 成本函数的凸性 3.1逻辑回归的替代方法 3.2 线性可分性和逻 ...

  8. 逻辑回归(Logistic Regression)简介及C++实现

    逻辑回归(Logistic Regression):该模型用于分类而非回归,可以使用logistic sigmoid函数( 可参考:http://blog.csdn.net/fengbingchun/ ...

  9. OpenCV3.3中逻辑回归(Logistic Regression)使用举例

    OpenCV3.3中给出了逻辑回归(logistic regression)的实现,即cv::ml::LogisticRegression类,类的声明在include/opencv2/ml.hpp文件 ...

  10. Logistic Regression

    Logistic Regression 又称逻辑回归,分类算法中的二分类算法,属于监督学习的范畴,算法复杂度低. 1.模型 Logistic Regression模型是广义线性模型的一种,属于线性的分 ...

最新文章

  1. BAPI_GOODSMVT_CREATE的几个应用
  2. 目前的计算机系统属于第三代电子计算机,计算机应用基础判断题
  3. PHP学习笔记【9】_表达式
  4. 【华为云技术分享】十分钟从入门到精通(下)——OBS权限配置
  5. CTF入门--题目介绍
  6. 人工智能在塑造未来移动应用开发中的作用
  7. 使用SCCM Toolkit2中的Trace32来查看MDT日志
  8. PeekMessage和GetMessage的区别
  9. 使用Editplus查看空格
  10. 计算机基础知识教案总结,计算机基础学习心得体会范文
  11. 中介者(Mediator)模式实例
  12. ArcGIS重装之旧软件卸不干净的问题
  13. 排序(使用插入法对数组元素从小到大排序)
  14. FPGA:逻辑函数的卡诺图化简法
  15. Linux下 ifconfig、ifup、ifdown使用说明
  16. springboot+shiro+jwt实现登录+权限验证
  17. android6.0新权限申请以及RxPermissions库的使用
  18. mct接收_Android实现文件上传功能(接收端用strust2)
  19. 2011年襄阳市高一下学期市统考数学试题
  20. 面向对象:怪蜀黍PK奥特曼

热门文章

  1. 深度学习之经典网络架构AlexNet(二)
  2. Java中判断输入的字符串是否为数字常用方法
  3. javascript 判断map为空
  4. Springboot AOP切面
  5. 什么是Docker容器?(全面了解使用)
  6. 如何制作微信公众号中的服务号以及订阅号
  7. 大型真人秀节目:buildozer 折腾记
  8. python获取微信群和群成员
  9. List的equals方法学习
  10. 22 | 如何让MySQL临时提升下性能