【机器学习实战学习笔记】Logistic 回归

    科技2024-07-08  75

    Logistic 回归

    概要一般过程基于Logistic回归和Sigmoid函数的分类基于最优化方法的最佳回归系数确定梯度上升法训练算法

    概要

    本章共分为四个部分: (1)Sigmoid函数和Logistic回归分类器 (2)最优化理论初步 (3)梯度下降最优化算法 (4)数据中的缺失项处理

    回归 假设有一些数据点,用一条直线对这些点进行拟合,这条线称为最佳拟合直线,这个拟合过程称为回归主要思想 根据现有数据对分类边界线建立回归公式,以此来进行分类

    一般过程

    Logistic回归的一般过程: (1)收集数据:采用任意方式收集数据 (2)准备数据:由于需要进行距离计算,因此要求数据类型为数值型。结构化数据格式最佳。 (3)分析数据:采用任意方法对数据进行分析 (4)训练算法:大部分时间将用于训练,训练的目的是为了找到最佳的分类回归系数 (5)测试算法:一旦训练步骤完成,分类将会很快 (6)使用算法:首先,我们需要输入一些数据,并将其转换成对应的结构化数值;接着,基于训练好的回归系数就可以对这些数值进行简单的回归计算,判定它们属于哪个类别;在这之后,我们就可以在输出的类别上做一些其他分析工作。

    基于Logistic回归和Sigmoid函数的分类

    Logistic回归: 优点:计算代价不高,易于理解和实现 缺点:容易欠拟合,分类精度可能不高 适用数据类型:数值型和标称型数据

    sigmoid函数: σ ( z ) = 1 1 + e − z \sigma(z)=\frac{1}{1+e^{-z}} σ(z)=1+ez1

    基于最优化方法的最佳回归系数确定

    sigmoid函数的输入记为 z z z z = w 0 x 0 + w 1 x 1 + . . . . . . + w n x n z=w_{0}x_{0}+w_{1}x_{1}+......+w_{n}x_{n} z=w0x0+w1x1+......+wnxn,写成向量的形式 z = w T x z=w^{T}x z=wTx。其中向量 x x x是分类器的输入数据,向量 w w w是最佳参数(系数),从而使得分类器尽可能地精确

    梯度上升法

    思想:要找到某函数的最大值,最好的方法沿着该函数的梯度方向探寻,如果梯度记为 ∇ \nabla ,则函数 f ( x , y ) f(x,y) f(x,y)的梯度: ∇ f ( x , y ) = ( ∂ f ( x , y ) ∂ x ∂ f ( x , y ∂ y ) \nabla f(x,y) = \begin{pmatrix} \frac{\partial{f(x,y)}}{\partial{x}}\\ \frac{\partial{f(x,y}}{\partial{y}} \end{pmatrix} f(x,y)=(xf(x,y)yf(x,y)

    迭代公式: w : = w + α ∇ w f ( w ) w:=w+\alpha \nabla_{w}f(w) w:=w+αwf(w),其中 α \alpha α记为步长

    训练算法

    伪代码: 每个回归系数初始化为1 重复R次: 计算整个数据集的梯度 使用alpha*gradient更新回归系数的向量 返回回归系数

    梯度上升方法寻找最佳参数

    from numpy import * import matplotlib.pyplot as plt """ Function: loading dataset Parameters: / Return/Output: dataMat: the matrix of data labelMat: the matrix of the label """ """ 文档格式:(x,y,label) """ def loadDataSet(): dataMat = [] labelMat = [] fr = open('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 """ Function: calculate the sigmoid value """ def sigmoid(inX): return 1.0 / (1 + exp(-inX)) def gradAscent(dataMatIn,classLabels): dataMatrix = mat(dataMatIn) labelMat = mat(classLabels).transpose() m,n = shape(dataMatrix) alpha = 0.001 # 步长 maxCycles = 500 # 最大循环数 weights = ones((n,1)) for k in range(maxCycles): h = sigmoid(dataMatrix * weights) error = (labelMat - h) weights = weights + alpha * dataMatrix.transpose() * error return weights """ Function: Plot the result Input: weights: the parameters' value of the line """ def plotBestFit(weights): dataMat,labelMat = loadDataSet() dataArr = array(dataMat) n = shape(dataArr)[0] x1 = [];y1 = [] x2 = [];y2 = [] for i in range(n): if int(labelMat[i]) == 1: # record the coordinate of the category 1 x1.append(dataArr[i][1]) y1.append(dataArr[i][2]) else: # record the coordinate of the category 0 x2.append(dataArr[i][1]) y2.append(dataArr[i][2]) fig = plt.figure() ax = fig.add_subplot(111) ax.scatter(x1,y1,s=30,c='red',marker='s') ax.scatter(x2,y2,s=30,c='green') # plot the line x = arange(-3.0,3.0,0.1) y = (-weights[0] - weights[1] * x) / weights[2] y = y.transpose() ax.plot(x,y) plt.xlabel('X1') plt.ylabel('Y1') plt.show() if __name__ == '__main__': dataMat,labelMat = loadDataSet() weights = gradAscent(dataMat,labelMat) plotBestFit(weights)

    Processed: 0.010, SQL: 9