手写--logistic回归

在二分类问题中,我们想要的函数应该是,能接受所有的输入然后预测出类别。例如,在两个类的情况下,上 述函数输出0或1。或许之前接触过具有这种性质的函数,该函数称为海维塞德阶跃函数 (Heaviside step function),或者直接称为单位阶跃函数。然而,海维塞德阶跃函数的问题在于: 该函数在跳跃点上从0瞬间跳跃到1,这个瞬间跳跃过程有时很难处理。幸好,另一个函数也有类 似的性质,且数学上更易处理,这就是Sigmoid函数。Sigmoid函数具体的计算公式如下:


 当x为0时,Sigmoid函数值为0.5。 随着x的增大,对应的Sigmoid值将逼近于1;而随着x的减小,Sigmoid值将逼近于0。如果横坐标刻度足够大,Sigmoid函数看起来很像一个阶跃函数。  因此,为了实现Logistic回归分类器,我们可以在每个特征上都乘以一个回归系数,然后把所有的结果值相加,将这个总和代入Sigmoid函数中,进而得到一个范围在0~1之间的数值。任何大于0.5的数据被分入1类,小于0.5即被归入0类。所以,Logistic回归也可以被看成是一种概率估计。 而等于0.5的恰是二分类的分界线。


下面我们来讨论逻辑回归求解回归系数的方法:


实战:

目标分析,testset文件现有100个点,第一列代表了点的x坐标,第二列代表了点的y坐标,第三列代表了点的所属标签。空间分布图如下所示,


我们需要求解回归系数,对二分类进行分界。


程序如下:

import numpy as np
import matplotlib.pyplot as plt
import random
#载入数据
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

#sigmod函数
def sigmoid(X):
    return 1.0/(1+np.exp(-X))

#梯度下降法
def gradAscent(X, Y):
    n_sample,n=X.shape
    W=np.ones((n,1))
    alpha=0.001
    Iter=50000
    #对数似然函数
    for i in range(Iter):
        #最大似然估计
        Loss=Y*(X.dot(W))-np.log(1+np.exp(X.dot(W)))
        #计算梯度
        grad=(Y*X)-(1/(1+np.exp(X.dot(W))))*np.exp(X.dot(W))*X
        grad=grad.mean(0)
        grad=grad.reshape([n,1])
        # 梯度上升
        W=W+alpha*grad
    return W
if __name__ == '__main__':
    dataMat, labelMat=loadDataSet()
    dataMat=np.array(dataMat)#100*3
    labelMat=np.array(labelMat).reshape((dataMat.shape[0],1))
    W = gradAscent(dataMat,labelMat)
    x1=np.arange(-3.0, 3.0, 0.1)
    x2= (-W[0] - W[1]*x1) / W[2]
    plt.plot(x1,x2)
    for i,x in enumerate(dataMat):
        if(labelMat[i,0]==1):
            plt.scatter(x[1],x[2],c='red')
        else:
            plt.scatter(x[1], x[2], c='green')
    plt.show()

最终结果图为:


个人思考:为什么分界线是一条直线,而不是一条曲线?因为分界线对应的sigmod函数值为0.5,对应的W*X=0,所以这是一条一次直线。


猜你喜欢

转载自blog.csdn.net/springtostring/article/details/80600764
今日推荐