梯度下降法解逻辑斯蒂回归

梯度下降法解逻辑斯蒂回归

本文是Andrew Ng在Coursera的机器学习课程的笔记。

Logistic回归属于分类模型。回顾线性回归,输出的是连续的实数,而Logistic回归输出的是[0,1]区间的概率值,通过概率值来判断因变量应该是1还是0。因此,虽然名字中带着“回归”(输出范围常为连续实数),但Logistic回归属于分类模型(输出范围为一组离散值构成的集合)。

整体步骤

假如我们的自变量是“数学课和英语课的成绩”,x={x1,x2},因变量是“能否被哥大录取”,y∈{0,1}。我们要通过这两个自变量的分布,来预测因变量的值。Logistic回归的步骤为:

  1. 设定拟合函数(hypothesis function):hθ(x),其意义是给定参数θ,根据输入x,给出输出hθ(x),当输出值大于0.5时预测录取,否则预测被拒。
  2. 设定代价函数(cost function):J(θ),其意义是累加所有样本的 预测结果hθ(x) 与 真实结果y 之间的差距。
  3. 利用梯度下降法,来调整参数θ,使得代价函数J(θ)的值最小。

比较线性回归与Logistic回归,可以看出二者非常相似,但是Logistic回归的拟合函数(步骤一)和代价函数(步骤二)的定义方法与线性回归有所不同。

Step 1:拟合函数

线性回归的拟合函数为:hθ(x) = θTx,输出范围为所有实数,而其因变量的取值范围也确实属于所有实数。但是Logistic回归的最终输出要么是0,要么是1,我们不能直接套用线性回归的拟合函数。对于Logistic回归,我们需要控制输出在[0,1]之间,因此借助函数g:

g(z)=11+e?zg(z)=11+e?z

函数g为S型函数(Sigmoid function),也称为Logistic function,“Logistic回归”就是得名于此。最终的拟合函数为:

hθ(x)=g(θTx)=11+e?θTxhθ(x)=g(θTx)=11+e?θTx

这个拟合函数的输出范围在[0,1]之间,表示分类结果为1的可能性。例如,我输入我的成绩,得到的拟合函数输出值为0.7,就表示我有70%的概率被哥大录取(30%的概率被拒)。当输出值超过0.5,我们将其分类为1(这表示模型最终预测我会被哥大录取)。值为0.5的线称为“Decision Boundary”(可以是曲线)。

想象一个三维坐标系(x1,x2,y),对于任意的地面坐标(x1,x2),都有唯一的y值与之对应。首先计算 θTx,值可正可负且没有边界。然后将其作为S型函数g的输入,得到的输出固定在[0,1]之间。当 θTx≥0时,h≥0.5,预测为1分类,否则为0分类。拟合函数的意义就在于将值固定在0到1之间。

Step 2:代价函数

如果直接套用线性回归的代价函数,那么得到的代价函数将非凸(non-convex),利用梯度下降我们可能停留在局部最小值,而不是我们想要的全局最小值。因此我们需要重新定义代价函数。

对于一个样本,我们新的代价函数定义如下:

公式可以进一步化简为:

Cost(hθ(x),y)=?ylog(hθ(x))?(1?y)log(1?hθ(x))Cost(hθ(x),y)=?ylog(hθ(x))?(1?y)log(1?hθ(x))

下图是代价函数曲线,横坐标为h的值,纵坐标为代价。可以看出,在y=1的前提下,如果预测值越接近1,那么相应代价就越小,反之则越大。

将所有m个样本的代价累加并平均,我们有最终的代价函数:

这个代价函数满足convex的条件,所以有全局最小值。其来源与最大似然估计有关,此处略去细节。

Step 3:梯度下降

我们采用与线性回归中一样的梯度下降法来确定θ的值,即设置一个合适的学习率α之后,同步更新所有j=1 to n:

重复更新步骤,直到代价函数的值收敛为止。

高级操作

我们在第三步使用的梯度下降法虽然可行,但是收敛速度比较慢。有不少高级梯度下降算法已经被提出,包括 Conjugate gradient、BFGS、L-BFGS 等等。这些算法的优点是不需要手动挑选学习率,速度也较快,但是缺点就是比较复杂,难以手动实现。不过,借助matlab我们就可以利用这些算法来计算了。我们可以利用matlab中的 fminunc函数(Find minimum of unconstrained multivariable function) 来实现高级操作。


1

2

3

options = optimset(‘GradObj’, ‘on’, ‘MaxIter’, ‘100’);

initialTheta = zeros(2,1);

[optTheta, functionVal, exitFlag] = fminunc(@costFunction, initialTheta, options);

fminunc函数 的:

  • 第一个参数是一个指向代价函数的指针,此代价函数需要返回代价值与各个参数的偏导数;
  • 第二个参数是θ的初始值;
  • 第三个参数是一些开关选项。

matlab代码

输入是ex2data1.txt文件,前两列是自变量,最后一列是因变量,用逗号分隔,格式类似于:

34.62365962451697,78.0246928153624,0

30.28671076822607,43.89499752400101,0

……

这个代码用两种方法来进行梯度下降,一种是常规方法,一种是高级方法。实验中发现常规方法经过了很长时间(大约好几分钟)还是没有收敛,且需要考虑学习率的大小;而高级方法只需要几秒钟就能收敛,并且不需要考虑学习率。


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

function logisticRegressionDemo(  )

%A demo of logistic regression

%   Logistic regression using traditional gradient descent and advanced methods

%% Load Data

data = load(‘ex2data1.txt‘);

X = data(:, [1, 2]); y = data(:, 3);

%% ============ Part 1: Compute Cost and Gradient ============

%  Setup the data matrix appropriately, and add ones for the intercept term

[m, n] = size(X);

% Add intercept term to x and X_test

X = [ones(m, 1) X];

% Initialize fitting parameters

initial_theta = zeros(n + 1, 1);

% Compute and display initial cost and gradient

[cost, grad] = costFunction(initial_theta, X, y);

theta = initial_theta;

iterNum = 50000;

costList = zeros(iterNum,1);

this method fails because it doesn‘t converge even I set iteration number to 50000, which takes quite a long time

for i=1:iterNum

    theta = theta - 0.001 * grad;

    [cost, grad] = costFunction(theta, X, y);

    costList(i,1)= cost;

end;

plot(costList);

% ======================= Predict  ============================

prob = sigmoid([1 45 85] * theta);

fprintf([‘For a student with scores 45 and 85, we predict an admission ‘ ...

         ‘probability of %f\n\n‘], prob);

%% ============= Part 2: Optimizing using fminunc  =============

%  Set options for fminunc

options = optimset(‘GradObj‘‘on‘‘MaxIter‘, 400);

%  Run fminunc to obtain the optimal theta

%  This function will return theta and the cost

[theta, cost] = fminunc(@(t)(costFunction(t, X, y)), initial_theta, options);

% ======================= Predict  ============================

prob = sigmoid([1 45 85] * theta);

fprintf([‘For a student with scores 45 and 85, we predict an admission ‘ ...

         ‘probability of %f\n\n‘], prob);

end

function g = sigmoid(z)

%SIGMOID Compute sigmoid functoon

%   J = SIGMOID(z) computes the sigmoid of z.

g = 1 ./ (1 + exp(-z));

end

function [J, grad] = costFunction(theta, X, y)

%COSTFUNCTION Compute cost and gradient for logistic regression

%   J = COSTFUNCTION(theta, X, y) computes the cost of using theta as the

%   parameter for logistic regression and the gradient of the cost

%   w.r.t. to the parameters.

% Initialize some useful values

m = length(y); % number of training examples

J = 0;

grad = zeros(size(theta));

for i = 1:m

    J = J + (-y(i)) * log(sigmoid(theta‘ * X(i,:)‘)) - (1-y(i)) * log(1-sigmoid(theta‘ * X(i,:)‘));

    grad = grad + (sigmoid(theta‘ * X(i,:)‘) - y(i)) * X(i,:)‘;

end

J = J / m;

grad = grad ./ m;

end

正则化:防止过拟合

我们采用正则化(Regularization)的方法,通过修改代价函数来防止过拟合。

过拟合问题一般归咎于过多的特征类型。有两种方法来减少过拟合:

  1. 丢掉一些特征,不过这样也丢失了一些信息;
  2. 正则化,修改代价函数,来限制参数值的大小

正则化除了能防止过拟合之外,还有一个好处就是可以避免利用normal equation一步到位地求得参数值中需要考虑的矩阵可逆问题,因为加入正则参数之后的矩阵总是可逆的。

修改之后的代价函数和梯度方程见下,出于习惯我们不对j=0的参数做正则化,但是即使做了影响也不大:

有关正则化的详细讨论可以见我爱公开课的笔记

标签: MachineLearning

时间: 2024-08-02 13:28:40

梯度下降法解逻辑斯蒂回归的相关文章

逻辑斯蒂回归

1,逻辑斯蒂回归问题有一组病人的数据,我们需要预测他们在一段时间后患上心脏病的“可能性”,就是我们要考虑的问题.通过二值分类,我们仅仅能够预测病人是否会患上心脏病,不同于此的是,现在我们还关心患病的可能性,即 f(x) = P(+1|x),取值范围是区间 [0,1]. 然而,我们能够获取的训练数据却与二值分类完全一样,x 是病人的基本属性,y 是+1(患心脏病)或 -1(没有患心脏病).输入数据并没有告诉我们有关“概率” 的信息. 在二值分类中,我们通过w*x 得到一个"score"

用二项逻辑斯蒂回归解决二分类问题

逻辑斯蒂回归: 逻辑斯蒂回归是统计学习中的经典分类方法,属于对数线性模型.logistic回归的因变量可以是二分类的, 也可以是多分类的 基本原理 logistic 分布 折X是连续的随机变量,X服从logistic分布是指X具有下列分布函数和密度函数: 其中为位置参数,为形状参数.与图像如下,其中分布函数是以为中心对阵,越小曲线变化越快 二项logistic回归模型: 二项logistic回归模型如下: 其中是输入,输出,W称为权值向量,b称为偏置, 是w和x的内积 参数估计 ? 假设: ?

第六章 逻辑斯蒂回归与最大熵模型

书中重要定义及一些理解 先通过介绍逻辑史蒂的分布来引出logist模型 而通过极大似然法来推导模型的参数估计问题 通过对模型参数的似然函数通过求导来得到递归方程 通过公式可以看出logist是对前面的感知机的升级版,感知机的判断方式过于简单.而其梯度下降的时候也将sign的去掉了,否则无法微分. 后通过方程来写出公式,代码如下 import numpy as np from read_data import get_2_kind_data def logistic_Regression(tra_

逻辑斯蒂回归(logisic regression)和SVM的异同

逻辑斯蒂回归主要用于二分类,推广到多分类的话是类似于softmax分类.求 上述问题可以通过最大化似然函数求解. 上述问题可以采用最小化logloss进行求解. 一般地,我们还需要给目标函数加上正则项,参数w加上l1或者l2范数. LR适合大规模数据,数据量太小的话可能会欠拟合(考虑到数据通常比较稀疏).另外,我们可以将连续型属性转化成离散型属性,这样可以提升模型的鲁棒性,防止模型过拟合. LR和SVM的异同点 相同点 1.他们都是分类算法,是监督学习算法. 2.如果不考虑核函数,LR和SVM都

逻辑斯蒂回归模型

http://blog.csdn.net/hechenghai/article/details/46817031 主要参照统计学习方法.机器学习实战来学习.下文作为参考. 第一节中说了,logistic 回归和线性回归的区别是:线性回归是根据样本X各个维度的Xi的线性叠加(线性叠加的权重系数wi就是模型的参数)来得到预测值的Y,然后最小化所有的样本预测值Y与真实值y‘的误差来求得模型参数.我们看到这里的模型的值Y是样本X各个维度的Xi的线性叠加,是线性的. Y=WX (假设W>0),Y的大小是随

[转]逻辑斯蒂回归 via python

# -*- coding:UTF-8 -*-import numpydef loadDataSet(): return dataMat,labelMat def sigmoid(inX): return 1.0/(1+numpy.exp(-inX)) def gradAscent(dataMatIn,classLabels): dataMatrix=numpy.mat(damaMatIn) labelMat=numpy.mat(classLabels).transpose() #上升梯度 alp

逻辑斯蒂回归(Logistic Regression)

逻辑回归名字比较古怪,看上去是回归,却是一个简单的二分类模型. 逻辑回归的目标函数是如下形式: 其中x是features,θ是feature的权重,σ是sigmoid函数.将θ0视为θ0*x0(x0取值为常量1),那么 这里我们取阈值为0.5,那么二分类的判别公式为: 下面说一下参数θ的求解: 为啥子这样去损失函数呢? 当y=1的时候,显然hθ(x)越接近1我们的预测越靠谱:y=0时同理.所以应该在y=1时,使损失韩式-log(hθ(x))越小越好,y=0时,同样使损失函数-log(1-hθ(x

《统计学习方法》第六章,逻辑斯蒂回归

? 使用逻辑地模型来进行分类,可以算出每个测试样本分属于每个类别的概率 ● 二分类代码 1 import numpy as np 2 import matplotlib.pyplot as plt 3 from mpl_toolkits.mplot3d import Axes3D 4 from mpl_toolkits.mplot3d.art3d import Poly3DCollection 5 from matplotlib.patches import Rectangle 6 7 data

梯度下降法解神经网络

本文是Andrew Ng在Coursera的机器学习课程的笔记. 整体步骤 确定网络模型 初始化权重参数 对于每个样例,执行以下步骤直到收敛 计算模型输出:forward propagation 计算代价函数:比较模型输出与真实输出的差距 更新权重参数:back propagation 确定网络模型 神经网络模型由输入层(layer 1).中间层(layer 2,..,L-1).输出层(layer L)三部分组成.输入层每个单元代表一个特征,输出层的每个单元代表一个类别. 如果我们的目标如果是识