逻辑回归模型(Logistic Regression)及Python实现
逻辑回归模型(Logistic Regression)及Python实现
1.模型
在分类问题中,比如判断邮件是否为垃圾邮件,判断肿瘤是否为阳性,目标变量是离散的,只有两种取值,通常会编码为0和1。假设我们有一个特征X,画出散点图,结果如下所示。这时候如果我们用线性回归去拟合一条直线:hθ(X) = θ0+θ1X,若Y≥0.5则判断为1,否则为0。这样我们也可以构建出一个模型去进行分类,但是会存在很多的缺点,比如稳健性差、准确率低。而逻辑回归对于这样的问题会更加合适。
逻辑回归假设函数如下,它对θTX作了一个函数g变换,映射至0到1的范围之内,而函数g称为sigmoid function或者logistic function,函数图像如下图所示。当我们输入特征,得到的hθ(x)其实是这个样本属于1这个分类的概率值。也就是说,逻辑回归是用来得到样本属于某个分类的概率。
2.评价
回想起之前线性回归中所用到的损失函数:
如果在逻辑回归中也运用这种损失函数,得到的函数J是一个非凸函数,存在多个局部最小值,很难进行求解,因此需要换一个cost函数。重新定义个cost函数如下:
当实际样本属于1类别时,如果预测概率也为1,那么损失为0,预测正确。相反,如果预测为0,那么损失将是无穷大。这样构造的损失函数是合理的,并且它还是一个凸函数,十分方便求得参数θ,使得损失函数J达到最小。
3.优化
我们已经定义好了损失函数J(θ),接下来的任务就是求出参数θ。我们的目标很明确,就是找到一组θ,使得我们的损失函数J(θ)最小。最常用的求解方法有两种:批量梯度下降法(batch gradient descent), 牛顿迭代方法((Newton's method)。两种方法都是通过迭代求得的数值解,但是牛顿迭代方法的收敛速度更加快。
批量梯度下降法:
牛顿迭代方法: (H为海瑟矩阵)
4.python代码实现
- # -*- coding: utf-8 -*-
- """
- Created on Wed Feb 24 11:04:11 2016
- @author: SumaiWong
- """
- import numpy as np
- import pandas as pd
- from numpy import dot
- from numpy.linalg import inv
- iris = pd.read_csv('D:\iris.csv')
- dummy = pd.get_dummies(iris['Species']) # 对Species生成哑变量
- iris = pd.concat([iris, dummy], axis =1 )
- iris = iris.iloc[0:100, :] # 截取前一百行样本
- # 构建Logistic Regression , 对Species是否为setosa进行分类 setosa ~ Sepal.Length
- # Y = g(BX) = 1/(1+exp(-BX))
- def logit(x):
- return 1./(1+np.exp(-x))
- temp = pd.DataFrame(iris.iloc[:, 0])
- temp['x0'] = 1.
- X = temp.iloc[:,[1,0]]
- Y = iris['setosa'].reshape(len(iris), 1) #整理出X矩阵 和 Y矩阵
- # 批量梯度下降法
- m,n = X.shape #矩阵大小
- alpha = 0.0065 #设定学习速率
- theta_g = np.zeros((n,1)) #初始化参数
- maxCycles = 3000 #迭代次数
- J = pd.Series(np.arange(maxCycles, dtype = float)) #损失函数
- for i in range(maxCycles):
- h = logit(dot(X, theta_g)) #估计值
- J[i] = -(1/100.)*np.sum(Y*np.log(h)+(1-Y)*np.log(1-h)) #计算损失函数值
- error = h - Y #误差
- grad = dot(X.T, error) #梯度
- theta_g -= alpha * grad
- print theta_g
- print J.plot()
- # 牛顿方法
- theta_n = np.zeros((n,1)) #初始化参数
- maxCycles = 10 #迭代次数
- C = pd.Series(np.arange(maxCycles, dtype = float)) #损失函数
- for i in range(maxCycles):
- h = logit(dot(X, theta_n)) #估计值
- C[i] = -(1/100.)*np.sum(Y*np.log(h)+(1-Y)*np.log(1-h)) #计算损失函数值
- error = h - Y #误差
- grad = dot(X.T, error) #梯度
- A = h*(1-h)* np.eye(len(X))
- H = np.mat(X.T)* A * np.mat(X) #海瑟矩阵, H = X`AX
- theta_n -= inv(H)*grad
- print theta_n
- print C.plot()
代码所用的数据下载地址:http://files.cnblogs.com/files/sumai/iris.rar
逻辑回归模型(Logistic Regression)及Python实现的更多相关文章
- 逻辑回归模型(Logistic Regression, LR)基础
逻辑回归模型(Logistic Regression, LR)基础 逻辑回归(Logistic Regression, LR)模型其实仅在线性回归的基础上,套用了一个逻辑函数,但也就由于这个逻辑函 ...
- 逻辑回归模型(Logistic Regression, LR)--分类
逻辑回归(Logistic Regression, LR)模型其实仅在线性回归的基础上,套用了一个逻辑函数,但也就由于这个逻辑函数,使得逻辑回归模型成为了机器学习领域一颗耀眼的明星,更是计算广告学的核 ...
- Python实践之(七)逻辑回归(Logistic Regression)
机器学习算法与Python实践之(七)逻辑回归(Logistic Regression) zouxy09@qq.com http://blog.csdn.net/zouxy09 机器学习算法与Pyth ...
- 机器学习算法与Python实践之(七)逻辑回归(Logistic Regression)
http://blog.csdn.net/zouxy09/article/details/20319673 机器学习算法与Python实践之(七)逻辑回归(Logistic Regression) z ...
- 机器学习/逻辑回归(logistic regression)/--附python代码
个人分类: 机器学习 本文为吴恩达<机器学习>课程的读书笔记,并用python实现. 前一篇讲了线性回归,这一篇讲逻辑回归,有了上一篇的基础,这一篇的内容会显得比较简单. 逻辑回归(log ...
- Python机器学习算法 — 逻辑回归(Logistic Regression)
逻辑回归--简介 逻辑回归(Logistic Regression)就是这样的一个过程:面对一个回归或者分类问题,建立代价函数,然后通过优化方法迭代求解出最优的模型参数,然后测试验证我们这个求解的模型 ...
- 机器学习二 逻辑回归作业、逻辑回归(Logistic Regression)
机器学习二 逻辑回归作业 作业在这,http://speech.ee.ntu.edu.tw/~tlkagk/courses/ML_2016/Lecture/hw2.pdf 是区分spam的. 57 ...
- 机器学习——逻辑回归(Logistic Regression)
1 前言 虽然该机器学习算法名字里面有"回归",但是它其实是个分类算法.取名逻辑回归主要是因为是从线性回归转变而来的. logistic回归,又叫对数几率回归. 2 回归模型 2. ...
- 逻辑回归(Logistic Regression)算法小结
一.逻辑回归简述: 回顾线性回归算法,对于给定的一些n维特征(x1,x2,x3,......xn),我们想通过对这些特征进行加权求和汇总的方法来描绘出事物的最终运算结果.从而衍生出我们线性回归的计算公 ...
- [机器学习] Coursera ML笔记 - 逻辑回归(Logistic Regression)
引言 机器学习栏目记录我在学习Machine Learning过程的一些心得笔记,涵盖线性回归.逻辑回归.Softmax回归.神经网络和SVM等等.主要学习资料来自Standford Andrew N ...
随机推荐
- Change Sudoers Mod 777 To 0440
Method 1: > grub --> recovery mode --> e > ro single <--> rw single init=/bin/bash ...
- Erlang OTP编程初体验——gen_server和行为模式
http://blog.sina.com.cn/s/blog_3fe961ae0101k4p6.html 行为模式其实非常类似于面向对象语言中的接口,至少笔者是这么理解的.OTP行为模式将一些反复出现 ...
- SQLite做为本地缓存的应用需要注意的地方
原文:SQLite做为本地缓存的应用需要注意的地方 今天看到了园友陆敏计的一篇文章<<C#数据本地存储方案之SQLite>>, 写到了SQLite的诸多优点,尤其适应于本地数据 ...
- 多线程中的lock,Monitor.Wait和Monitor.Pulse
我们知道lock实际上一个语法糖糖,C#编译器实际上把他展开为Monitor.Enter和Monitor.Exit,即: lock(lockObj) { //... } ////相当于(.Net4以前 ...
- 基于go语言的心跳响应
我们在使用tcp ip 通讯的时候,都需要使用心跳机制来判断服务器与客户端的连接状态,如果服务器的心跳超时等,会做出重新连接等机制, 基于这种问题,我今天给大家推荐了一个基于go语言的心跳响应机制,废 ...
- FrameLayout帧布局
一.FrameLayout(帧布局)重点: FrameLayout(帧布局)可以说是五大布局中最为简单的一个布局,这个布局会默认把控件放在屏幕上的左上角的区域,后续添加的控件会覆盖前一个,如果控件的大 ...
- 微软 2018 年第一笔收购:文件存储公司 Avere Systems
微软 2018 年第一笔收购:文件存储公司 Avere Systems 2018 年 1 月 4 日, 9:47 上午 · Picturepan2 微软今天宣布收购文件存储公司 Avere Syste ...
- Clustered filesystem with membership version support
A computer system with read/write access to storage devices creates a snapshot of a data volume at a ...
- Method and Apparatus for Providing Highly-Scalable Network Storage for Well-Gridded Objects
An apparatus comprising a plurality of storage nodes comprising a plurality of corresponding storage ...
- 网络编程Socket之TCP之connect具体解释
对TCP套接字调用connect会激发三次握手,例如以下: client是主动打开连接的一端,会发送第一个SYN分节,然后等待确认,此时连接状态为SYN_SENT,当收到服务端的确认后连接建立,状态变 ...