首页 > 其他 > 详细

MLA Review之四:logistic回归

时间:2016-02-21 02:04:12      阅读:231      评论:0      收藏:0      [点我收藏+]

终于来到logistic回归,logistic回归其实很简单,之前的说到的神经网络就用到了这个方法,其中最重要的就是使用了sigmoid损失函数。当然使用的方法也就最简单的梯度下降法,这里并没有使用之前神经网络的随机梯度下降法,也是为了简单起见。因为之前在神经网络里面使用过了,所以这篇文章就略微介绍下。

?

logistic回归是属于广义线性回归的一种,基本形式:

z=w0+w1*x1+w2*x2+...+wn*xn

s=1/(1+exp(-z))

损失函数:1/2* (s-y)^2

?

然后按照梯度下降方法求解参数即可

?

代码如下:

?

# -*- coding: UTF8 -*-
"""
author:luchi
date:16/2/19
desc:
    logistic回归,最常用的回归问题,虽然是回归但是更多的是用到了分类的问题上
    其主要的函数是sigmoid,以及使用的训练参数方法也是最常使用的梯度下降法
"""
import math
import numpy as np
def loadDataset():

    retDataset=[]
    retLabels=[]
    fr=open("testSet.txt")
    for str in fr.readlines():
        strList=str.strip().split()
        retDataset.append([1.0,float(strList[0]),float(strList[1])])
        retLabels.append(int(strList[2]))
    return retDataset,retLabels

"""
计算sigmoid函数
"""
def sigmoid(inX):
    return 1.0/(1+np.exp(-inX))

"""
梯度下降方法训练参数
"""
def GradientDecrease(epoch,dataset,labels,alpha):

    weight=np.ones((len(dataset[0]),1)) #初始化权重
    weightMat=np.mat(weight)
    datasetMat=np.mat(dataset)
    labelsMat=np.mat(labels).transpose()

    size=len(dataset)
    for i in range(epoch):

        result=datasetMat*weightMat
        result=sigmoid(result)

        error=result-labelsMat
        # print result
        # print 1-result
        grad=np.multiply(result,1-result)
        # print grad
        # print alpha*multiply(multiply(error,grad),datasetMat)
        nweightMat=np.multiply(np.multiply(error,grad),datasetMat)
        # print np.sum(nweightMat,axis=0)/float(size)
        weightMat=weightMat-alpha*(np.sum(nweightMat,axis=0)/float(size)).transpose()
        # print weightMat
    # print weightMat
    return weightMat



def plotBestFit(weights):
    import matplotlib.pyplot as plt
    dataMat,labelMat=loadDataset()
    dataArr = np.array(dataMat)
    n = np.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 = np.arange(-3.0, 3.0, 0.1)
    y = (-weights[0]-weights[1]*x)/weights[2]
    print len(y)
    ax.plot(x, y)
    plt.xlabel(‘X1‘); plt.ylabel(‘X2‘);
    plt.show()

dataset,labels=loadDataset()

# dataset=np.array([[1,1,2],[1,2,3]])
# labels=np.array([0,1])
weights=GradientDecrease(500,dataset,labels,alpha=0.25)
print weights
plotBestFit(np.array(weights))

?结果如下:


bubuko.com,布布扣
?

从图中可以看出效果还不错。

?

logistic回归是一种比较简单的方法,与其说是回归,其实更多的可以将其列为二元分类问题,因为sigmoid函数的特点,而且据说logistic回归在现实工作中还运用的比较多,可见并不是都是要高大上的东西才有运用空间,只要实用,也是不错的

?

最后说一说在Python里面有自带的sum函数,例如计算a=[1,2,3] sum(a)即为6,但是程序中使用到的是numpy里面的sum函数,numpy里面的sum函数还可以设置第二个参数,sum(a,axis),其中a就是array数组或者矩阵,axis=0表示按列求和,axis=1表示按行求和,这点需要注意。另外如果涉及到array或者矩阵的math运算,需要使用numpy里面的相对应的math函数,因此程序中是import numpy as np,然后使用np.log()等等,这点需要注意的

MLA Review之四:logistic回归

原文:http://luchi007.iteye.com/blog/2277591

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!