← 计算机

逻辑回归

计算机

文章封面

原理

损失函数

$$Cost(h_𝜃(x),y) = \begin{cases} -log(h_𝜃(x)), & \text{if $y$ = 1} \ -log(1-h_𝜃(x)), & \text{if $y$ = 0} \end{cases}$$

海维赛德阶跃函数 单位阶跃函数

$$h_𝜃(x)=\frac{1}{1+e^{-𝜃^{T}x}}$$

随机梯度上升算法伪代码:

优点:

缺点:

sklearn代码示例

from numpy import *

x = array([
[1.0,1,2],
[1.0,2,4.1],
[1.0,7,11],
[1.0,5,15],
[1.0,12,12],
],dtype='float32')
y = array([0,0,1,1,1])


def sigmoid(X):
    return 1.0 / (1 + exp(-X))

def SGradAscent(X,Y):
    m,n = shape(X)
    alpha = 0.001
    wei = ones(n)
    for i in range(m*2):
        h = sigmoid(sum(X[i//m] * wei))
        err = Y[i//m] - h
        wei = wei + alpha * err * X[i//m]
        print(err,wei,h)
    return wei

def stocGradAscent(X,y,num=150):
    m,n = shape(X)
    wei = ones(n)
    for j in range(num):
        indice = [k for k in range(m)]
        for i in range(m):
            alpha = 4/(1.0 + j + i) + 0.01
            randIndex = int(random.uniform(0,len(indice)))
            h = sigmoid(sum(X[randIndex] * wei))
            err = y[randIndex] - h
            wei += X[randIndex] * alpha * err
            print('err:{} wei:{}'.format(err,wei))
            del indice[randIndex]
    return wei



def LR1(x,y):

    wei = stocGradAscent(x,y,1000)
    print(wei)

    import matplotlib.pyplot as plt

    # wei = wei.getA()
    n = shape(x)[0]
    xcord1 = []
    xcord2 = []
    ycord1 = []
    ycord2 = []

    for i in range(n):
        if int(y[i]) == 1:
            xcord1.append(x[i,1])
            ycord1.append(x[i,2])
        else:
            xcord2.append(x[i,1])
            ycord2.append(x[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')

    k = arange(-30.0,30.0,0.1)
    v = (-wei[0] - wei[1] * k)/wei[2]
    ax.plot(k,v)
    plt.show()

# LR1(x,y)
def ori_lr(x,y):
    from sklearn.linear_model import LogisticRegression
    lr = LogisticRegression()
    clf = lr.fit(x,y)
    x1 = array([[7,8],[1,2.1]])
    y1 = array([1,0])
    sor = clf.score(x1,y1)
    pre = clf.predict(x1)
    print(pre)

# ori_lr(x,y)
读到这里,感谢你的时间。继续阅读 →