逻辑回归是个二分类问题,具体原理网上有很多,这里只列出Python实现过程。
原理参考:逻辑回归
参考《机器学习实战》,对于逻辑回归参数寻优时,采用梯度下降法和随机梯度下降两种方法实现。
Python定义梯度下降函数:
# 梯度下降法
def gardDescent(dataMatIn,classLabels):
dataMatrix = mat(dataMatIn)
labelMatrix = mat(classLabels).T
m,n = shape(dataMatrix) # 得到数据规模
# 迭代步长
alpha = 0.01
# 迭代次数
maxCycles = 5000
weights = ones((n,1)) # help(numpy.ones)
# 设定初始参数,全为1
for k in range(maxCycles):
h = sigmoid(dataMatrix * weights) # sigmoid函数已定义
E = (h - labelMatrix)
weights = weights - alpha * dataMatrix.T * E
return weights
Python定义随机梯度下降函数:
梯度上升算法在每次更新回归系数时都需要遍历整个数据集,一种改进方法是一次仅用一个样本点来更新回归系数,该方法称为随机梯度上升算法。由于可以在新样本到来时对分类器进行增量式更新,因而随机梯度上升算法是一个在线学习算法。与“在线学习 ”相对应 ,一次处理所有数据被称作是“批处理” 。
随机梯度上升算法可以写成如下的伪代码:
所有回归系数初始化为 1
对数据集中每个样本:
计算该样本的梯度
使用 alpha x gradient ^ ,得到新回归系数值
返回回归系数值
# 随机梯度上升算法
# 每次对参数的更新都只用一个样本值,属于在线算法
def stocGradAscent0(dataMatrix,classLabels):
dataMatrix = array(dataMatrix)
m,n = shape(dataMatrix)
alpha = 0.01
weights = ones(n)
for i in range(m):
h = sigmoid(sum(dataMatrix[i] * weights))
E = classLabels[i] - h
weights = weights + alpha * E * dataMatrix[i]
return weights
可以 看到 ,随机梯度下降算法与梯度下降算法在代码上很相似,但也有一些区别:
- 第一 ,后者的变量 & 和误差 都是向量,而前者则全是数值;
- 第二 ,前者没有矩阵的转换过程,所有变量的数据类型都是 numpy 数组。
Python实现逻辑回归
from numpy import *
import matplotlib.pyplot as plt
print('\n###############logistic regression#####################')
# 载入数据
def loadDataSet():
dataMat = []; labelMat = []
fr = open('testSet.txt')
# 逐行读入数据,然后strip去头去尾,用split分组
for line in fr.readlines():
lineArr = line.strip().split(' ')
dataMat.append([1.0,float(lineArr[0]),float(lineArr[1])])
labelMat.append(int(lineArr[2]))
return dataMat,labelMat
# 定义sigmoid函数
def sigmoid(inX):
return 1.0/(1+exp(-inX))
########## 梯度下降法,见上面