您的位置:首页 > 其它

机器学习之逻辑回归(Logistic Regression)

2016-11-20 22:20 274 查看
逻辑回归是工业界使用频率最高也是最受广泛使用的一种机器学习算法,它是基于线性回归在一些分类问题上由于噪音样本的存在使拟合的直线偏离真实的太大的一种改进,将线性函数的值映射到(0,1)区间范围内,也可以完美地将这个模型和概率联系起来,下面开始介绍逻辑回归.

这篇文章主要是将之前整理的笔记再加上一些新的知识整合起来的~~

1.逻辑函数模型(model)

构造思路理解1:线性回归的x和y是通过线性函数连续起来的,x和y在值域R内,而逻辑函数想要将y压缩在(0,1)之间,即引入概率P来解释y,那么p属于(0,1),y属于R,怎么建立连续,在数学上做一些转化,发现log[ p/(1-p)]=y 可以将值域完成从R到(0,1)区间的转化,就有如下图所示的logistic 函数的构造过程了.这里的y是指代线性函数的y

构造思路理解2:看过逻辑函数更详尽解释资料的同学会发现,逻辑回归在数学上是归为广义线性模型的,因为逻辑函数的对数模型是线性的,这里引入一个概念,是几率(概率发生和概率不发生比值的对数),即log[ p/(1-p)]=wx,是线性的,将wx用衔接函数Z表示,即可得到y(或者是p)与x之间的关系.



2.逻辑函数假设(hyohothesis)

逻辑函数可以通过概率解释,非0即1,是一个标准的二分类模型(多分类用到softmax函数),因此用概率的数学表达式可以将其假设空间写成如下图的形式:



3.逻辑函数决策边界(decision boundary)

那么,一般地,逻辑函数的决策边界是wx=0.5,也就是说通过机器学习算法学到的参数w和x的乘积大于0.5,属于一类结果,小于0.5属于另一类结果,当然决策边界是可以变化的,对最终的参数学习和模型准确率都有重要的影响.



4.逻辑函数损失函数(loss function)

4.1.机器算法的目的是使得模型的与真实值之间的差值越小越好,也就引入损失函数来进行计算,和线性回归一样,逻辑回归的损失函数是通过最小二乘法计算的(正态分布相联系)



4.2 从概率角度,函数的概率越大越好,数学变换为负的概率的对数越小越好(引入log完全是为了数学上方便运算)



5.逻辑函数损失函数最小化算法

5.1 对损失函数求导:

对于最小二乘法和概率形式的逻辑回归损失函数,经过求导后形式如下图,两种得到的求导结果不一样,因为最小二乘容易陷入局部最优,因此一般逻辑回归会用到概率形式的损失函数求导结果进行后面的参数运算,可以看出来逻辑回归的概率损失函数求导后的形式和线性回归是一样的.



5.2 梯度下降进行迭代:

线性函数是有解析解存在的情况,而逻辑函数是没有解析解的,只能通过梯度下降的方法进行迭代,直到不再变化返回参数w作为最终的结果



但是梯度下降非常依赖初始值的设置,很容易陷入局部最优,但是在实际中,这种方法是有效的,因此被大量使用.但当训练数据很多或者训练参数很多时,训练是很耗时的,梯度下降需要进行一些优化来提升训练时间的,常用的三种梯度下降方法以及区别如下:在实际中视自己的任务选择合适的梯度下降算法.



5.3 牛顿法进行迭代:

除了用梯度法进行迭代计算参数意外,还可以用牛顿法进行计算,牛顿达可以从两方面进行理解:

一、几何角度:直线的斜率



二、数学角度:泰勒展开



由上可见,梯度下降算法和牛顿算法的不同,梯度下降是一阶导,牛顿算法是二阶导,因此牛顿法收敛的更快,但是其算法复杂度较高。两者比较如下:



6.逻辑函数算法实践

本文使用了世上最直白中逻辑回归的算法,对逻辑回归的数学过程进行深入的了解,代码也是源自此,在CSDN中可以找的到这篇文章和代码:

# -*- coding: utf-8 -*-
import matplotlib .pyplot as plt
from numpy import *

#load data
def load_dataset():
X = [[1,0.005*xi] for xi in range(1,100)]
Y = [2*xi[1] for xi in X]
return X,Y

def sigmoid(z):
t = exp(z)
return t/(1+t)

sigmoid_vec = vectorize(sigmoid) #将矩阵中的每一个元素分别计算sigmoid

#grad descent solve regression
def grad_descent(X,Y):
X = mat(X) #转为矩阵 (row,col)
Y = mat(Y) #转为矩阵 (1,row)
row,col = shape(X)
alpha = 0.05
maxIter = 5000
w = ones((1,col))
V = zeros((row,row),float32) #L矩阵(row,row)
for k in range(maxIter):
L = sigmoid_vec(w*X.transpose()) #L矩阵(1,col)*(col,row)=(1,rol)
for i in range(row):
V[i,i] = L[0,i]*(L[0,i]-1) #矩阵L第0行,第i列
w = w - alpha * (Y - L)*V*X #w=(1,row)*(row,row)*(row,col)=(1.col)
return w

def main():
X, Y =load_dataset()
w = grad_descent(X,Y)
print "w =", w

#draw linear regression result
x = [xi[1] for xi in X]
y = Y
plt.title("Logistic regression")
plt.plot(x, y, marker="*",c='r') #画出来raw 图
xM = mat(X)
y2 = sigmoid_vec(w*xM.transpose()) #y2矩阵(1,col)*(col,row)=(1,rol)
y22 = [y2[0,i] for i in range(y2.shape[1])] #矩阵转list,作图
plt.plot(x,y22,marker="o",c='g') #画出来拟合图
plt.grid()
plt.show()

if __name__ == "__main__":
main()
上述代码简单构造了线性函数并通过logistic和随机梯度迭代500次,进行结果输出,代码运行的结果可视化如下:



得到的参数w的值如下:



总结:logistic函数,概率和机器学习完美结合的一个机器学习回归模型,掌握这种模型是非常重要的

本文参考来自:

1.世上最直白的logistic regression教程

2. Ng视频logistic相关
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  机器学习