目录

0. 前言

1. Sigmoid 函数

2. 梯度上升与梯度下降

3. 梯度下降法(Gradient descent)

4. 梯度上升法(Gradient ascent)

5. 梯度下降/上升法的数学推导

6. 随机梯度下降/上升法(Stochastic gradient descent/ascent)

7. 实战案例

7.1. 简单案例

7.2. 病马死亡率案例


学习完机器学习实战的逻辑回归,简单的做个笔记。文中部分描述属于个人消化后的理解,仅供参考。

本篇综合了先前的文章,如有不理解,可参考:

吴恩达机器学习(二)多元线性回归

吴恩达机器学习(四)逻辑回归

吴恩达机器学习(五)正则化

吴恩达机器学习(十五)大规模机器学习

所有代码和数据可以访问 我的 github

如果这篇文章对你有一点小小的帮助,请给个关注喔~我会非常开心的~

0. 前言

逻辑回归(Logistic Regression)是一种基于最优化思想的二分类监督学习算法。

其主要思想是根据现有数据对分类边界线建立回归公式,以此分类

其目的是寻找一个非线性函数  的最佳拟合参数,求解过程可以通过最优化算法完成。

  • 优点:计算代价不高,易于理解和实现
  • 缺点:容易造成欠拟合,分类精度不高
  • 适用数据类型:数值型和标称型数据

1. Sigmoid 函数

线性回归中,对数据进行拟合,是在每个特征上都乘以一个回归系数,然后把所有结果再相加,即  ,向量化即  。

逻辑回归中,再将  带入  函数,可得到属于  范围的一个数值,若大于  则属于正类,若小于则反之。

 函数的定义如下:

 函数的图像如下:

综合上述,整体公式表示为:

2. 梯度上升与梯度下降

梯度:某一函数在该点处的方向导数沿该方向取得最大值,即在该点变化率(斜率)最大。

  • 梯度上升法:寻找某函数的最大值,沿着该函数的梯度方向寻找
  • 梯度下降法:寻找某函数的最小值,沿着该函数的梯度方向寻找

梯度符号记为  , 的梯度可表示为,对各个方向求偏导数:

如下图所示,求最小值,可采用梯度下降法:

梯度下降:  ,当  在最小值左边时,导数为负数, 向右移;当  在最小值右边时,导数为正数, 向左移。

如下图所示,求最大值,可采用梯度上升法:

梯度上升:  ,当  在最小值左边时,导数为正数, 向右移;当  在最小值右边时,导数为负数, 向左移。

3. 梯度下降法(Gradient descent)

梯度下降法的代价函数如下定义:

代价函数是指,函数值越大,付出的代价越大,即精度越差。

第二项是正则化项,是为了防止过拟合而设定,先忽略这项。

第一项是所有样本计算结果的求平均,若  ,则取  ,若  ,则取  。

由上图易得, 时,若  越接近  代价越大, 时,若  越接近  代价越大。

为了降低代价函数  ,可采取梯度下降法,定义如下:

4. 梯度上升法(Gradient ascent)

梯度上升法求解逻辑回归参数,和梯度下降法求解参数原理是一样的。

只是在梯度上升法中, 定义如下:

与梯度下降法只相差一个负号,所以是求解最大值,采用梯度上升法:

5. 梯度下降/上升法的数学推导

以梯度上升法为例子,不考虑正则化项:

对三项分别计算:

综合三项可得:

综上所述,在梯度上升法中:

6. 随机梯度下降/上升法(Stochastic gradient descent/ascent)

以随机梯度下降法为例子,随机梯度下降法是对梯度下降法的改进。

梯度下降法中,每次更新参数都需要遍历整个数据集,又称作 Batch gradient descent 。

随机梯度下降法中,每次更新参数只随机选择一个样本点,通过每次更新参数的迭代而选择不同的样本点。

算法流程如下:

随机梯度下降/上升法是一个在线算法,可以在新数据来临的时候直接更新参数,而不用遍历整个数据集。

7. 实战案例

以下将展示书中案例的代码段,所有代码和数据可以在github中下载:

7.1. 简单案例

# coding:utf-8
from numpy import *
import matplotlib.pyplot as plt"""
简单案例
"""# sigmoid函数
def sigmoid(inX):return 1.0 / (1 + exp(-inX))# 梯度上升求解J(\theta)
# Batch gradient ascent
def gradAscent(dataMatIn, classLabels):# 转换为矩阵dataMatrix = mat(dataMatIn)# 转换为矩阵后转置,表示为列向量labelMat = mat(classLabels).transpose()m, n = shape(dataMatrix)alpha = 0.001maxCycles = 500# \theta 表示为列向量weights = ones((n, 1))# 梯度上升迭代for k in range(maxCycles):h = sigmoid(dataMatrix * weights)error = (labelMat - h)weights = weights + alpha * dataMatrix.transpose() * errorreturn weights# 加载数据集
def loadDataSet():dataMat = []labelMat = []fr = open('testSet.txt')for line in fr.readlines():# 去除头尾空字符,按照空格分割字符串lineArr = line.strip().split()# 添加偏置位 w_0(\theta_0) 相乘的 x_0 = 1.0dataMat.append([1.0, float(lineArr[0]), float(lineArr[1])])labelMat.append(int(lineArr[2]))return dataMat, labelMat# 画出数据的分界线
def plotBestFit(weights):dataMat, labelMat = loadDataSet()dataArr = array(dataMat)n = shape(dataArr)[0]xcord1 = []ycord1 = []xcord2 = []ycord2 = []# 遍历每一条数据,根据类别将x1, x2分别插入不同的List中for i in range(n):if int(labelMat[i]) == 1:xcord1.append(dataArr[i, 1])ycord1.append(dataArr[i, 2])else:xcord2.append(dataArr[i, 1])ycord2.append(dataArr[i, 2])fig = plt.figure()ax = fig.add_subplot(111)ax.scatter(xcord1, ycord1, s=30, c='red', marker='s')ax.scatter(xcord2, ycord2, s=30, c='green')x = array(arange(-3.0, 3.0, 0.1))# x=x1, y=x2 表示的是 w0x0+w1x1+w2x2 = 0 的直线y = (-weights[0] - weights[1] * x) / weights[2]ax.plot(x, y)plt.xlabel('X1')plt.ylabel('X2')plt.show()if __name__ == '__main__':dataArr, labelMat = loadDataSet()weights = gradAscent(dataArr, labelMat)# getA():#   将矩阵转换为ndarrayplotBestFit(weights.getA())

7.2. 病马死亡率案例

# coding:utf-8
from numpy import *"""
病马死亡率案例
"""# sigmoid函数
def sigmoid(inX):return 1.0 / (1 + exp(-inX))# 随机梯度上升
# stochastic gradient ascent
def stocGradAscent0(dataMatrix, classLabels):m, n = shape(dataMatrix)alpha = 0.01weights = ones(n)# 遍历每一个数据for i in range(m):# 数组对应元素相乘再相加h = sigmoid(sum(dataMatrix[i] * weights))error = classLabels[i] - hweights = weights + alpha * error * dataMatrix[i]return weights# 改进后的随机梯度上升
# 学习率随迭代次数减少
# 随机选择样本
def stocGradAscent1(dataMatrix, classLabels, numIter=150):m, n = shape(dataMatrix)weights = ones(n)for j in range(numIter):dataIndex = list(range(m))for i in range(m):# 学习率降低alpha = 4 / (1.0 + j + i) + 0.0001randIndex = int(random.uniform(0, len(dataIndex)))h = sigmoid(sum(dataMatrix[dataIndex[randIndex]] * weights))error = classLabels[dataIndex[randIndex]] - hweights = weights + alpha * error * dataMatrix[dataIndex[randIndex]]del (dataIndex[randIndex])return weights# 分类函数
def classifyVector(inX, weights):prob = sigmoid(sum(inX * weights))if prob > 0.5:return 1else:return 0# 构件逻辑回归分类器,进行分类测试
def colicTest():frTrain = open('horseColicTraining.txt')frTest = open('horseColicTest.txt')trainingSet = []trainingLabels = []# 遍历训练集for line in frTrain.readlines():currLine = line.strip().split('\t')lineArr = []for i in range(21):lineArr.append(float(currLine[i]))# 创建训练集的特征向量和标签trainingSet.append(lineArr)trainingLabels.append(float(currLine[21]))# 随机梯度上升求解参数trainWeights = stocGradAscent1(array(trainingSet), trainingLabels, 1000)correctCount = 0numTestVec = 0.0# 遍历测试集for line in frTest.readlines():numTestVec += 1.0currLine = line.strip().split('\t')lineArr = []for i in range(21):lineArr.append(float(currLine[i]))if int(classifyVector(array(lineArr), trainWeights)) == int(currLine[21]):correctCount += 1accuracy = (float(correctCount) / numTestVec)print("the accuracy of this test is: %f" % accuracy)return accuracy# 多次测试分类器
def multiTest():numTests = 10correctSum = 0.0for k in range(numTests):correctSum += colicTest()print("after %d iterations the average accuracy is: %f" % (numTests, correctSum / float(numTests)))if __name__ == '__main__':multiTest()

如果这篇文章对你有一点小小的帮助,请给个关注喔~我会非常开心的~

机器学习实战(四)逻辑回归LR(Logistic Regression)相关推荐

  1. 机器学习算法与Python实践之逻辑回归(Logistic Regression)

    转载自:http://blog.csdn.net/zouxy09/article/details/20319673 机器学习算法与Python实践这个系列主要是参考<机器学习实战>这本书. ...

  2. 逻辑回归模型(Logistic Regression, LR)基础

    逻辑回归模型(Logistic Regression, LR)基础 逻辑回归(Logistic Regression, LR)模型其实仅在线性回归的基础上,套用了一个逻辑函数,但也就由于这个逻辑函数, ...

  3. 逻辑回归模型(Logistic Regression, LR)基础 - 文赛平

     逻辑回归模型(Logistic Regression, LR)基础 - 文赛平 时间 2013-11-25 11:56:00 博客园精华区 原文  http://www.cnblogs.com/ ...

  4. logisticregression参数_通俗地说逻辑回归【Logistic regression】算法(二)sklearn逻辑回归实战...

    前情提要: 通俗地说逻辑回归[Logistic regression]算法(一) 逻辑回归模型原理介绍 上一篇主要介绍了逻辑回归中,相对理论化的知识,这次主要是对上篇做一点点补充,以及介绍sklear ...

  5. 逻辑回归(Logistic Regression, LR)简介

    逻辑回归(Logistic Regression, LR)简介 标签(空格分隔): 机器学习 **机器学习最通俗的解释就是让机器学会决策.**对于我们人来说,比如去菜市场里挑选芒果,从一堆芒果中拿出一 ...

  6. 使用聚类算法(Kmeans)进行数据降维并作为分类算法逻辑回归(logistic Regression)的数据预处理步骤实战

    使用聚类算法(Kmeans)进行数据降维并作为分类算法逻辑回归(logistic Regression)的数据预处理步骤实战 目录

  7. [机器学习] Coursera ML笔记 - 逻辑回归(Logistic Regression)

    引言 机器学习栏目记录我在学习Machine Learning过程的一些心得笔记,涵盖线性回归.逻辑回归.Softmax回归.神经网络和SVM等等.主要学习资料来自Standford Andrew N ...

  8. 机器学习--逻辑回归模型(Logistic Regression)

    1.逻辑回归 逻辑回归(Logistic Regression)是一种用于二元分类问题的机器学习算法.逻辑回归的目的是基于输入特征预测一个样本属于某个特定的类别的概率. 逻辑回归的核心思想是将线性回归 ...

  9. Python机器学习算法 — 逻辑回归(Logistic Regression)

    逻辑回归--简介 逻辑回归(Logistic Regression)就是这样的一个过程:面对一个回归或者分类问题,建立代价函数,然后通过优化方法迭代求解出最优的模型参数,然后测试验证我们这个求解的模型 ...

  10. 逻辑回归二分类算法python_多分类逻辑回归 (Multinomial Logistic Regression)

    前言 分类从结果的数量上可以简单的划分为: 二分类(Binary Classification) 多分类(Multinomial Classification). 其中二分类是最常见且使用最多的分类场 ...

最新文章

  1. AI时代,谈数据分析时我们要谈些什么?
  2. 网站优化之网站文章更新需注意哪些问题?
  3. tomcat的服务器配置详解
  4. LED和LCD的区别
  5. python history没有定义_python AttributeError:'Tensor'对象没有属性'_keras_history'_python_酷徒编程知识库...
  6. 深度学习(四十四)——GAN的评估指标, DCGAN, WGAN-GP, CGAN, BEGAN EBGAN
  7. 分布式锁的三种实现方式_分布式锁的几种实现方式~
  8. P3302 SDOI2013森林
  9. eclipse插件开发_开发Eclipse插件
  10. 打印机上的一款驱动-惠普LaserJet1020Plus打印机驱动提供下载
  11. 杰理蓝牙AC69xx系列开发环境搭建
  12. TFT-ST7789 方向调整
  13. elasticsearch实战 中文+拼音搜索
  14. 乒乓球:浅析业余高手从输球中总结的10条心得!
  15. 小程序使用 企业微信客户服务插件(联系我) contactPlugin
  16. 原生JavaScript实现AJAX、JSONP
  17. GBK-unicode对照
  18. 学python好就业吗?
  19. 20190827-Ubuntu查看内存槽的数目及内存信息
  20. 最大类间方差法(大津法OTSU)原理

热门文章

  1. android形状drawable
  2. Request介绍及演示样例 PART1
  3. VC菜菜鸟-创建一个简单的多线程任务
  4. Eeic Meyer on CSS 之 背景半透明效果
  5. UVA-10817- Headmaster's Headache(状压DP)
  6. svn从本地更新了资源库的资源后删除了某个文件夹无法恢复(已解决)
  7. kotlin项目开发基础之gradle初识
  8. CodeForces 589J Cleaner Robot
  9. md5sum/opensll md5
  10. 如何解决cellIndex在IE下兼容性问题