逻辑回归也被称为广义线性回归模型,它与线性回归模型的形式基本相同,最大的区别是它们的因变量不同,如果是连续的,就是多重线性回归,如果是二项分布,就是 Logistic回归。

Logistic回归虽然名字里带“回归”,但它实际上是一种分类方法,主要用于二分类问题。逻辑回归就是这样的一个过程:面对一个回归或者分类问题,建立相应的函数,然后通过优化方法迭代求解出最优的模型参数,然后测试验证这个求解的模型的好坏。

机器学习入门 逻辑回归 逻辑回归训练_逻辑回归

构造预测函数

机器学习入门 逻辑回归 逻辑回归训练_逻辑回归_02

构造损失函数

机器学习入门 逻辑回归 逻辑回归训练_逻辑回归_03

梯度下降法求解最小值

机器学习入门 逻辑回归 逻辑回归训练_机器学习入门 逻辑回归_04

数据操作

from numpy import *
import pandas as pd
from pandas import DataFrame
filename='./data.txt' #文件目录
def loadDataSet():   #读取数据(这里只有两个特征)
    df=pd.read_csv(filename)
    dataMat = []
    labelMat = []
    fr = open(filename)
    for line in fr.readlines():
        lineArr = line.strip().split()
        dataMat.append([1.0, float(lineArr[0]), float(lineArr[1])])  #前面的1,表示方程的常量。比如两个特征X1,X2,共需要三个参数,W1+W2*X1+W3*X2
        labelMat.append(int(lineArr[2]))
    return dataMat,labelMat
def sigmoid(inX):  #sigmoid函数
    return 1.0/(1+exp(-inX))
def GradAscent(dataMat, labelMat): #改进版随机梯度上升,在每次迭代中随机选择样本来更新权重,并且随迭代次数增加,权重变化越小。
    dataMatrix=mat(dataMat)
    classLabels=labelMat
    m,n=shape(dataMatrix)
    weights=ones((n,1))
    maxCycles=500
    for j in range(maxCycles): #迭代
        dataIndex=[i for i in range(m)]
        for i in range(m): #随机遍历每一行
            alpha=4/(1+j+i)+0.0001  #随迭代次数增加,权重变化越小。
            randIndex=int(random.uniform(0,len(dataIndex)))  #随机抽样
            h=sigmoid(sum(dataMatrix[randIndex]*weights))
            error=classLabels[randIndex]-h
            weights=weights+alpha*error*dataMatrix[randIndex].transpose()
            del(dataIndex[randIndex]) #去除已经抽取的样本
    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]
    ax.plot(x, y)
    plt.xlabel('X1')
    plt.ylabel('X2')
    plt.show()
    plt.savefig('logExample.png', format='png')
def main():
    datamat,labelmat=loadDataSet()
    weights= GradAscent(datamat, labelmat).getA()
    plotBestFit(weights)

if __name__=='__main__':
    main()

机器学习入门 逻辑回归 逻辑回归训练_逻辑回归_05