逻辑回归及其python实现
2017-12-29 16:12
561 查看
逻辑回归原理
sigmod函数下图给出了sigmod 函数在不同坐标尺度下的两条曲线图。当 x 为 0 日牝 Sigmoid 函数值为 0.5 。
随着 1 的增大,对应的sigmod值将逼近于 1; 而随着 x 的减小, Sigmoid 值将逼近于 0 。如果横坐标
刻度足够大(下图 ),sigmod 函数看起来很像一个阶跃函数。
原理
上图,将y作为正例的可能性,则1-y是反例的可能性
• 无需事先假设数据分布
• 可得到“类别”的近似概率预测
• 可直接应用现有数值优化算法求取最优解
如何确定最优系数
若将 y 看作类后验概率估计
则:
写为
:
显然
于是,可使用“极大似然法”
给定数据集
最大化“对数似然”(log-likelihood)函数
梯度上升法
原理梯度上升法基于的思想是:要找到某函数的最大值,最好的方法是沿着该函数的梯度方向探寻。如果梯度记为 ^ , 则函数 f(x,y)的梯度由下式表示 :
梯度上升算法沿梯度方向移动了一步。可以看到,梯度算子总是指向函数值增长最快的方向。这里所说的是移动方向,而未提到移动量的大小。该量值称为步长,记做\alpha。用向量来表示的话,梯度算法的迭代公式如下
该公式将一直被迭代执行,直至达到某个停止条件为止,比如迭代次数达到某个指定值或算 法达到某个可以允许的误差范围
算法
伪代码
我们现在采用的是 100 个样本的简单数据集,它包含了两个特征X1 和 X2
from numpy import * def loadDataSet(): dataMat = []; labelMat = [] fr = open('C:/Users/elenawang/Documents/machinelearninginaction/Ch05/testSet.txt') 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 def sigmoid(inX): return 1.0/(1+exp(-inX)) def gradAscent(dataMatIn, classLabels): dataMatrix = mat(dataMatIn) #convert to NumPy matrix labelMat = mat(classLabels).transpose() #convert to NumPy matrix m,n = shape(dataMatrix) alpha = 0.001 maxCycles = 500 weights = ones((n,1)) for k in range(maxCycles): #heavy on matrix operations h = sigmoid(dataMatrix*weights) #matrix mult error = (labelMat - h) #vector subtraction weights = weights + alpha * dataMatrix.transpose()* error #matrix mult return weights
看看效果
dataarr,labelmat=loadDataSet() gradAscent(dataarr,labelmat)
matrix([[ 4.12414349], [ 0.48007329], [-0.6168482 ]])
画出决策边界
def plotBestFit(weights): import matplotlib.pyplot as plt dataMat,labelMat=loadDataSet() dataArr = array(dataMat) n = shape(dataArr)[0] xcord1 = []; ycord1 = [] xcord2 = []; ycord2 = [] for i in 4000 range(n): if int(labelMat[i])== 1: xcord1.append(dataArr[i,1]); ycord1.append(dataArr[i,2]) else: xcord2.append(dataArr[i,1]); ycord2.append(dataArr[i,2]) fig = plt.figure() ax = fig.add_subplot(111) ax.scatter(xcord1, ycord1, s=30, c='red', marker='s') ax.scatter(xcord2, ycord2, s=30, c='green') x = arange(-3.0, 3.0, 0.1) y = (-weights[0]-weights[1]*x)/weights[2] y = array(y) ax.plot(x, y[0]) #必须是y[0] plt.xlabel('X1'); plt.ylabel('X2'); plt.show()
weights=gradAscent(dataarr,labelmat) plotBestFit(weights)
随机梯度上升
原理梯度上升算法在每次更新回归系数时都需要遍历整个数据集, 该方法在处理 100 个左右的数据集时尚可,但如果有数十亿样本和成千上万的特征,那么该方法的计算复杂度就太高了。一 种改进方法是一次仅用一个样本点来更新回归系数,该 方 法 称 为 随 机 梯 度 上 升 算 法 。 由于可以在新样本到来时对分类器进行增量式更新,因而随机梯度上升算法是一个在线学习算法。与 “在线学习 ” 相对应,一次处理所有数据被称作是 “ 批处理” 。
算法
伪代码:
初始化回归系数为1
重复下面步骤直到收敛{
对数据集中每个样本 计算该样本的梯度 使用alpha xgradient来更新回归系数
}
def stocGradAscent0(dataMatrix, classLabels): m,n = shape(dataMatrix) alpha = 0.01 weights = ones(n) #initialize to all ones for i in range(m): h = sigmoid(sum(dataMatrix[i]*weights)) error = classLabels[i] - h weights = weights + dot(alpha * error ,dataMatrix[i]) return weights
def plotBestFit(weights): import matplotlib.pyplot as plt dataMat,labelMat=loadDataSet() dataArr = array(dataMat) n = shape(dataArr)[0] xcord1 = []; ycord1 = [] xcord2 = []; ycord2 = [] for i in range(n): if int(labelMat[i])== 1: xcord1.append(dataArr[i,1]); ycord1.append(dataArr[i,2]) else: xcord2.append(dataArr[i,1]); ycord2.append(dataArr[i,2]) fig = plt.figure() ax = fig.add_subplot(111) ax.scatter(xcord1, ycord1, s=30, c='red', marker='s') ax.scatter(xcord2, ycord2, s=30, c='green') x = arange(-3.0, 3.0, 0.1) y = (-weights[0]-weights[1]*x)/weights[2] y = array(y) ax.plot(x, y) #改成y plt.xlabel('X1'); plt.ylabel('X2'); plt.show()
weights=stocGradAscent0(dataarr,labelmat) plotBestFit(weights)
增加迭代次数改进上述算法
相关文章推荐
- 逻辑回归(logistic regression)及其Python实现
- [机器学习]逻辑回归公式推导及其梯度下降法的Python实现
- 逻辑回归(Logistic Regression)原理及Python实现
- 逻辑回归python实现(随机增量梯度下降,变步长)
- 机器学习:逻辑回归python实现
- 【机器学习】逻辑回归原理及其实现
- 用Python实现机器学习算法:逻辑回归
- python sklearn-04:逻辑回归及其效果评估
- Python实现Logistic Regression(逻辑回归)
- [深度学习]Python/Theano实现逻辑回归网络的代码分析
- 【机器学习算法-python实现】逻辑回归的实现(LogicalRegression)
- 逻辑回归的python实现
- Python实现逻辑回归
- 【机器学习算法-python实现】逻辑回归的实现(LogicalRegression)
- 转载:逻辑回归的python实现
- 机器学习之逻辑回归python实现
- 二,机器学习算法之逻辑回归(python实现)
- [深度学习]Python/Theano实现逻辑回归网络的代码分析
- 逻辑回归详解及Python实现
- 【机器学习算法-python实现】逻辑回归的实现(LogicalRegression)