Logistic回归模型和Python实现
回归分析是研究变量之间定量关系的一种统计学方法,具有广泛的应用。
Logistic回归模型
线性回归
先从线性回归模型开始,线性回归是最基本的回归模型,它使用线性函数描述两个变量之间的关系,将连续或离散的自变量映射到连续的实数域。
模型数学形式:
引入损失函数(loss function,也称为错误函数)描述模型拟合程度:
使J(w)最小,求解优化问题得到最佳参数。
Logistic回归
logistic回归(Logistic regression 或 logit regression)有时也被译为"逻辑回归",不过它和"逻辑"并没有太大关系应该只是音译。从内容来讲,它最合适的名字应该是logit回归。
logistic回归模型更多的被用于概率分类器中。线性回归将自变量映射到连续的实数,在很多情况下因变量的取值是在有限的区间中的,最常见的如概率问题的0-1区间。
Sigmod函数提供了一个从实数域到(0,1)的映射:
该函数如图:
以数学形式给出把线性模型映射到0-1的方式:
逆变换:
这个变换被称为logit变换,或许就是该模型名字的来源。
logistic回归通常被用做概率分类器,以p=0.5作为分解线。
求解规划模型
最小二乘法
最小二乘法通过数学推导得到全局最优解的表达式,是一种完全数学描述的方法,直接给出求解公式。
最小二乘法可以得到全局最优解,但是因涉及超大矩阵的求逆运算而难以求解。
梯度下降(上升)法:
梯度下降法是一种典型的贪心算法,它从任意一组参数开始,向着使目标函数最小的方向调整参数,直至无法使目标函数继续下降时,停止计算。
多元函数微积分中, 梯度指向函数值变化最快方向的向量. 梯度下降法无法保证的得到全局最优解
梯度下降法有批量梯度下降法和随机梯度下降法两种实现方法。
批量梯度下降(上升)法(Batch Gradient Descent/Ascent)
批量梯度下降法的算法流程:
初始化回归系数为1
重复执行直至收敛 {
计算整个数据集的梯度
按照递推公式更新回归梯度
}
返回最优回归系数值
将损失函数J(w)求偏导,得到J(w)的梯度。以矩阵形式给出:
alpha是下降步长,由迭代公式:
随机梯度下降(上升)法(stochastic gradient Descent/Ascent)
随机梯度下降法的算法流程:
初始化回归系数为1
重复执行直至收敛 {
对每一个训练样本{
计算样本的梯度
按照递推公式更新回归梯度
}
}
返回最优回归系数值
为了加快收敛速度,做出两个改进:
(1)在每次迭代时,调整更新步长alpha的值。随着迭代的进行,alpha越来越小
(2)每次迭代改变样本的顺序,也就是随机选择样本来更新回归系数
Logistic 回归的实现
训练数据testSet.txt,包含m行n+1列:
m行代表m条数据,每条数据前n列代表n个样本,第n+1列代表分类标签(0或1)。
Python:
分类器被封装在类中:
from numpy import *
import matplotlib.pyplot as plt
def sigmoid(X):
return 1.0/(1+exp(-X))
class logRegressClassifier(object):
def __init__(self):
self.dataMat = list()
self.labelMat = list()
self.weights = list()
def loadDataSet(self, filename):
fr = open(filename)
for line in fr.readlines():
lineArr = line.strip().split()
dataLine = [1.0]
for i in lineArr:
dataLine.append(float(i))
label = dataLine.pop() # pop the last column referring to label
self.dataMat.append(dataLine)
self.labelMat.append(int(label))
self.dataMat = mat(self.dataMat)
self.labelMat = mat(self.labelMat).transpose()
def train(self):
self.weights = self.stocGradAscent1()
def batchGradAscent(self):
m,n = shape(self.dataMat)
alpha = 0.001
maxCycles = 500
weights = ones((n,1))
for k in range(maxCycles): #heavy on matrix operations
h = sigmoid(self.dataMat * weights) #matrix mult
error = (self.labelMat - h) #vector subtraction
weights += alpha * self.dataMat.transpose() * error #matrix mult
return weights
def stocGradAscent1(self):
m,n = shape(self.dataMat)
alpha = 0.01
weights = ones((n,1)) #initialize to all ones
for i in range(m):
h = sigmoid(sum(self.dataMat[i] * weights))
error = self.labelMat[i] - h
weights += (alpha * error * self.dataMat[i]).transpose()
return weights
def stocGradAscent2(self):
numIter = 2
m,n = shape(self.dataMat)
weights = ones((n,1)) #initialize to all ones
for j in range(numIter):
dataIndex = range(m)
for i in range(m):
alpha = 4/(1.0+j+i)+0.0001 #apha decreases with iteration, does not
randIndex = int(random.uniform(0,len(dataIndex)))#go to 0 because of the constant
h = sigmoid( sum(self.dataMat[randIndex] * weights) )
error = self.labelMat[randIndex] - h
weights += (alpha * error * self.dataMat[randIndex]).transpose()
del(dataIndex[randIndex])
return weights
def classify(self, X):
prob = sigmoid(sum( X * self.weights))
if prob > 0.5:
return 1.0
else:
return 0.0
def test(self):
self.loadDataSet('testData.dat')
weights0 = self.batchGradAscent()
weights1 = self.stocGradAscent1()
weights2 = self.stocGradAscent2()
print('batchGradAscent:', weights0)
print('stocGradAscent0:', weights1)
print('stocGradAscent1:', weights2)
if __name__ == '__main__':
lr = logRegressClassifier()
lr.test()
Matlab
上述Python代码用Matlab实现并不难(只是需要拆掉类封装),只是Matlab的广义线性模型工具箱提供了Logistic模型的实现。
trainData = [0 1; -1 0; 2 2; 3 3; -2 -1;-4.5 -4; 2 -1; -1 -3];
group = [1 1 0 0 1 1 0 0]';
testData = [5 2;3 1;-4 -3];
[testNum, attrNum] = size(testData);
testData2 = [ones(testNum,1), testData];
B = glmfit(trainData, [group ones(size(group))],'binomial', 'link', 'logit')
p = 1.0 ./ (1 + exp(- testData2 * B))
B = glmfit(X, [Y N],'binomial', 'link', 'logit')
X参数为特征行向量组, Y为代表预先分组的列向量,N是一个与Y同型的向量,Y(i)的在[0 N(i)]范围内取值。
B为[1, x1, x2,...]的系数,测试数据的第一列被加上了1。
p = 1.0 ./ (1 + exp(- testData2 * B))
代入sigmoid函数求解。
Logistic回归模型和Python实现的更多相关文章
- 【Spark机器学习速成宝典】模型篇02逻辑斯谛回归【Logistic回归】(Python版)
目录 Logistic回归原理 Logistic回归代码(Spark Python) Logistic回归原理 详见博文:http://www.cnblogs.com/itmorn/p/7890468 ...
- 【机器学习速成宝典】模型篇03逻辑斯谛回归【Logistic回归】(Python版)
目录 一元线性回归.多元线性回归.Logistic回归.广义线性回归.非线性回归的关系 什么是极大似然估计 逻辑斯谛回归(Logistic回归) 多类分类Logistic回归 Python代码(skl ...
- Logistic回归 python实现
Logistic回归 算法优缺点: 1.计算代价不高,易于理解和实现2.容易欠拟合,分类精度可能不高3.适用数据类型:数值型和标称型 算法思想: 其实就我的理解来说,logistic回归实际上就是加了 ...
- Logistic回归python实现小样例
假设现在有一些点,我们用一条直线对这些点进行拟合(该线称为最佳拟合直线),这个拟合过程就称作回归.利用Logistic回归进行分类的主要思想是:根据现有数据对分类边界线建立回归公式,依次进行分类.Lo ...
- 逻辑回归模型(Logistic Regression)及Python实现
逻辑回归模型(Logistic Regression)及Python实现 http://www.cnblogs.com/sumai 1.模型 在分类问题中,比如判断邮件是否为垃圾邮件,判断肿瘤是否为阳 ...
- Logistic回归python实现
2017-08-12 Logistic 回归,作为分类器: 分别用了梯度上升,牛顿法来最优化损失函数: # -*- coding: utf-8 -*- ''' function: 实现Logistic ...
- 吴裕雄--天生自然python机器学习:使用Logistic回归从疝气病症预测病马的死亡率
,除了部分指标主观和难以测量外,该数据还存在一个问题,数据集中有 30%的值是缺失的.下面将首先介绍如何处理数据集中的数据缺失问题,然 后 再 利 用 Logistic回 归 和随机梯度上升算法来预测 ...
- 吴裕雄--天生自然python机器学习:Logistic回归
假设现在有一些数据点,我们用 一条直线对这些点进行拟合(该线称为最佳拟合直线),这个拟合过程就称作回归.利用Logistic回归进行分类的主要思想是:根据现有数据对分类边界线建立回归公式,以此进行分类 ...
- 机器学习实战之Logistic回归
Logistic回归一.概述 1. Logistic Regression 1.1 线性回归 1.2 Sigmoid函数 1.3 逻辑回归 1.4 LR 与线性回归的区别 2. LR的损失函数 3. ...
随机推荐
- 一次与iptables有关的Openstack排错
先说下环境: 宿主机A(192.168.1.242)上运行着实例a(192.168.1.176), 宿主机B(192.168.1.56)上运行着实例b(192.168.1.50). 用户说从实例b上t ...
- Nest查询示例
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- 深入Python(4):深拷贝和浅拷贝
一.前奏:熟悉Python内存管理 在Python中,变量在第一次赋值时自动声明,在创建---也就是赋值的时候,解释器会根据语法和右侧的操作数来决定新对象的类型. 引用计数器:一个内部跟踪变量 引用计 ...
- rtl8723 2个 wlan
安装8723bs.ko模块之后,生成了wlan0和wlan1,MAC地址一样. http://blog.csdn.net/djman007/article/details/46731335 解决方法: ...
- iOS开发之音频口通信-通过方波来收发数据
之前做过的项目有需要通过音频口通信用方波来收发数据,由于这方面的资料比较少,下面就介绍下其原理,希望能给大家帮助. 一. 音频通信简介大家应该都知道支付宝声波支付和拉卡拉吧,它们都是利用手机的音频口( ...
- Python开发程序:选课系统
本节作业: 选课系统 角色:学校.学员.课程.讲师要求:1. 创建北京.上海 2 所学校2. 创建linux , python , go 3个课程 , linux\py 在北京开, go 在上海开3. ...
- linux查看是否被入侵
一.检查系统日志 lastb命令检查系统错误登陆日志,统计IP重试次数 二.检查系统用户 1.cat /etc/passwd查看是否有异常的系统用户 2.grep “0” /etc/passwd查看是 ...
- SQL Server索引进阶第五篇:索引包含列 .
包含列解析所谓的包含列就是包含在非聚集索引中,并且不是索引列中的列.或者说的更通俗一点就是:把一些底层数据表的数据列包含在非聚集索引的索引页中,而这些数据列又不是索引列,那么这些列就是包含列.同时,这 ...
- 旋转toast 自定义toast方向,支持多个方向的显示,自定义View
package com.example.canvasdemo; import java.security.InvalidAlgorithmParameterException; import andr ...
- ligerui_ligerTree_005_动态增加“树”节点
动态添加ligerTree节点:效果图: 源码地址:http://download.csdn.net/detail/poiuy1991719/8571255 <%@ page language= ...