机器学习实战:Logistic回归

Logistic回归

最优化算法的一种。用一条直线对一些数据点进行拟合的过程称为回归。

回归的核心是寻找最佳拟合参数。

Sigmoid函数

sigma (z) = 1 / (1 + e^{-z})

随着z的增加,对应的Sigmoid值将逼近1;随着z的减少,对应的Sigmoid值将逼近0。Sigmoid值在0~1范围中,大于0.5的数据被分到1类,小于0.5的数据被分到0类。

Sigmoid函数的输入

z = w_{0}x_{0} + w_{1}x_{1} + w_{2}x_{2}+...+w_{n}x_{n}

向量x是分类器的输入数据,向量w是最佳参数。

w0 = 1,x0为直线截距。

梯度上升法

基本思想:要找到某函数的最大值,最好的方法是沿着该函数的梯度方向探寻。

w:= w + \alpha \bigtriangledown_{w} f(w) alpha是步长

 

示例:使用梯度上升找到最佳参数

(1) 处理文件数据:每行前两个值为X1和X2,第三个值为数据对应的类别。将X0的值设为1.0。

def loadDataSet():
    dataMat = []
    labelMat = []
    fr = open('./testSet.txt','r')
    for line in fr:
        line = line.strip()
        line = line.split('\t')
        dataMat.append([1.0,float(line[0]),float(line[1])])
        labelMat.append(int(line[-1]))
    return dataMat,labelMat

(2) sigmoid函数


def sigmoid(z):
    return 1/(1+np.exp(-z))

(3) 梯度上升寻找最优参数


def gradAscent(dataMatIn,classLabels):
    dataMat = np.mat(dataMatIn)
    labelMat = np.mat(classLabels).transpose()
    row,col = np.shape(dataMatIn)
    weights = np.ones((col,1))
    alpha = 0.001
    MaxCycles = 500
    
    for k in range(MaxCycles):
        h = sigmoid(dataMat * weights)
        error = classLabels - h
        weights += alpha * dataMat.transpose() * error
    return weights

 

示例:随机梯度上升

随机梯度上升一次仅用一个样本点来更新回归系数,是一个在线学习算法。

def stocGradAscent0(dataMatIn,classLabels):
    row,col = np.shape(dataMatIn)
#   weights = np.ones((col,1))
    weights = np.ones(col)
    alpha = 0.01
#   MaxCycles = 500
    
    for i in range(row):
        h = sigmoid(sum(dataMatIn[i] * weights))
        error = classLabels[i] - h
        weights += alpha * dataMatIn[i] * error
    return weights

stocGradAscent0(np.array(dataArr),labelMat)

 

示例:改进的随机梯度上升 

改进的地方:

(1) alpha每次迭代的时候都会调整。随着迭代次数不断减小,但永远不会减少到0。

(2) 随机选取样本更新回归系数。

def stocGradAscent0(dataMatIn,classLabels,numIter = 500):
    row,col = np.shape(dataMatIn)
#   weights = np.ones((col,1))
#   alpha = 0.01
    weights = np.ones(col)
#   MaxCycles = 500
    dataIndex = list(range(row))

    for j in range(numIter):
        for i in range(row):
            alpha = 4/(1 + i + j) + 0.01
            randIndex = int(np.random.uniform(0,len(dataIndex)))
            h = sigmoid(sum(dataMatIn[randIndex] * weights))
            error = classLabels[randIndex] - h
            weights += alpha * dataMatIn[randIndex] * error
            del dataIndex[randIndex]
    return weights

stocGradAscent0(np.array(dataArr),labelMat)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值