这一节我们就要用到之前学到的知识,手动实现一个逻辑回归模型,我们先看一下我们的训练数据:
你可以认为x1,x2是一个零件的两个观测值,y值代表这个零件是否合格。1为合格,0为不合格。


x1,x2,y
4.031037,5.752561,0
6.235383,5.378605,1
6.765404,5.355658,1
6.419033,5.310136,1
5.798132,4.344252,1
6.301242,4.920588,1
4.872734,6.700532,0
4.065126,4.687534,0
4.997293,5.210845,0
3.945859,4.750626,0
5.366451,4.241285,1
5.096317,4.340056,1
4.712425,4.333078,1
3.870388,5.326660,0
5.006156,5.733306,0
4.705624,4.152684,1
3.953668,4.765652,0
5.283542,6.200848,0
4.638222,4.902532,0
2.808177,5.292739,0
5.695961,3.782322,1
5.075487,4.269202,1
5.744872,4.193219,1
4.488953,5.816292,0
4.668142,4.243716,1
5.343382,5.703429,0
5.433869,2.752747,1
6.277863,4.585656,1
4.833429,4.129666,1
2.724828,5.559132,0
3.918907,2.861533,1
5.558562,4.716934,1
6.978558,6.133955,1
6.235552,3.256282,1
4.311632,4.715995,0
4.765106,3.183854,1
5.018641,5.968272,0
6.406650,4.968574,1
4.330660,6.667718,0
6.841076,3.193401,1
5.487802,4.156802,1
5.309051,4.272118,1
4.394221,4.230730,0
5.932596,5.649194,1
3.382820,4.567539,0
6.457704,4.390767,1
3.829641,6.148506,0
4.131655,4.109773,0
5.566668,4.961172,1
5.408042,4.418642,1

在图形上表现是这样的:

这里我们需要用python来实现,其中用到了科学计算的numpy包,如果你不熟悉numpy,可以看一下我的写关于numpy快速入门的文章然后我们的实现是这样的:


import numpy as np

data = np.loadtxt("C:\lr.txt",delimiter=",")
fd = data[:,:-1]
ld = data[:,-1].reshape((fd.shape[0],1))

loop = 100000
rate = 0.05
w = np.ones((1,2))
b = 1

def zfunc():
    return fd.dot(w.T)+b

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

def y_hat():
    return sigmoid(zfunc())

def error():
    return y_hat()-ld

def dwfunc():
    return fd*error()

for i in range(loop):
    dw = dwfunc().mean(axis=0).reshape((1,2))
    db = error().mean()
    w -= rate*dw
    b -= rate*db
print(w,b)
print(np.hstack((ld,y_hat()>0.5)))

得到的结果为


[[ 13.04713165 -12.00360679]] -7.433010473957195
[[0. 0.]
 [1. 1.]
 [1. 1.]
 [1. 1.]
 [1. 1.]
 [1. 1.]
 [0. 0.]
 [0. 0.]
 [0. 0.]
 [0. 0.]
 [1. 1.]
 [1. 1.]
 [1. 1.]
 [0. 0.]
 [0. 0.]
 [1. 1.]
 [0. 0.]
 [0. 0.]
 [0. 0.]
 [0. 0.]
 [1. 1.]
 [1. 1.]
 [1. 1.]
 [0. 0.]
 [1. 1.]
 [0. 0.]
 [1. 1.]
 [1. 1.]
 [1. 1.]
 [0. 0.]
 [1. 1.]
 [1. 1.]
 [1. 1.]
 [1. 1.]
 [0. 0.]
 [1. 1.]
 [0. 0.]
 [1. 1.]
 [0. 0.]
 [1. 1.]
 [1. 1.]
 [1. 1.]
 [0. 0.]
 [1. 1.]
 [0. 0.]
 [1. 1.]
 [0. 0.]
 [0. 0.]
 [1. 1.]
 [1. 1.]]

从结果中可以看出来w1 = 13.04713165 w2 = -12.00360679, b = -7.433010473957195。后边矩阵的第一列是观测值,第二列是预测值,可以看到全部预测正确了。实际上最终我们是找到了这样一条线:

发表评论

电子邮件地址不会被公开。 必填项已用*标注

%d 博主赞过: