BAT面试题5:关于LR

接下来,每天一道BAT面试题陪伴你,只要你坚持下来,日积月累,你会在不知不觉中就步入机器学习的大门,并且越走越远。同时,还能助你顺利拿到OFFER. 你应该学会为自己鼓掌,同样的掌声送给一直奋斗的你们。

BAT面试题5:关于LR

理解透LR,最直白的方法就是通过一个例子,动手实现LR源码,而不是调包。好的,下面我们直接开始动手实现LR源码。

Step1 生成模拟的数据集

为了编写代码模拟二分类任务,我们的第一步工作是先生成用于测试的数据集。首先看下生成的用于模拟的数据集长得样子,它有两个特征w1,w2组成,共有200个样本点,现在的任务是要对这个数据集进行分类。

下面是用于模拟上图数据的代码,按照一定规律均匀分布含有两个特征的数据点,因此data表示以上所有的样本点和标签值组成的数据集,head10:

 1      w1               w2          y
 2array([[ 0.78863156,  0.45879449,  1.        ],
 3
 4       [ 0.70291388,  0.03437041,  1.        ],
 5
 6       [ 0.89775764,  0.24842968,  1.        ],
 7
 8       [ 0.92674416,  0.13579184,  1.        ],
 9
10       [ 0.80332783,  0.71211063,  1.        ],
11
12       [ 0.7208047 ,  0.48432214,  1.        ],
13
14       [ 0.8523947 ,  0.06768344,  1.        ],
15
16       [ 0.49226351,  0.24969169,  1.        ],
17
18       [ 0.85094261,  0.79031018,  1.        ],
19
20       [ 0.76426901,  0.07703571,  1.        ]])

下面介绍,如何用梯度下降法,求出两个特征对应的权重参数,进而能正确的预测,当一个新的样本点来的时候,能预测出属于0类,还是1类。

Step2 梯度下降求权重参数

设定一个学习率迭代参数,当与前一时步的代价函数与当前的代价函数的差小于阈值时,计算结束,我们将得到3个权重参数,其中包括两个特征的权重参数,和偏置项的权重参数。

假定模型的决策边界为线性模型,梯度下降求逻辑回归模型的权重参数的基本思路和四个公式如下:

1'model' 建立的逻辑回归模型:包括Sigmoid映射
2
3'cost' 代价函数
4
5'gradient'  梯度公式
6
7'theta update'  参数更新公式
8
9'stop stratege'  迭代停止策略:代价函数小于阈值法

不要忘记初始化一列偏置项:做一个偏移量和2个特征的组合,这样与前面推送的理论部分衔接在一起,代码如下所示:

  1'偏移量 b shape=(200,1)'
  2
  3b = np.ones(200)
  4
  5'将偏移量与2个特征值组合 shape = (200,3)'
  6
  7X = np.hstack((b,X))
  8
  9'model'
 10
 11def sigmoid(x):
 12
 13    return 1/(1+ np.exp(-x))
 14
 15def model(theta,X):
 16
 17    theta = np.array(theta)
 18
 19    return sigmoid( X.dot(theta) )
 20
 21'cost'
 22
 23def cost(m,theta,X,y):
 24
 25    ele = y*np.log(model(theta,X)) + (1-y)*np.log(1-model(theta,X))
 26
 27    item_sum = np.sum(ele)
 28
 29    return -item_sum/m
 30
 31'gradient'
 32
 33
 34
 35
 36def gradient(m,theta,X,y,cols):
 37
 38    grad_theta = []
 39
 40    for j in range(cols):
 41
 42        grad = (model(theta,X) - y).dot(X[:,j])
 43
 44        grad_sum = np.sum(grad)    
 45
 46        grad_theta.append(grad_sum/m)
 47
 48    return np.array(grad_theta)
 49
 50'theta update'
 51
 52def theta_update(grad_theta,theta,sigma):
 53
 54    return theta - sigma * grad_theta
 55
 56'stop stratege'
 57
 58def stop_stratege(cost,cost_update,threshold):
 59
 60    return cost-cost_update < threshold
 61
 62'逻辑回归算法'
 63
 64
 65def LogicRegression(X,y,threshold,m,xcols):
 66
 67    start = time.clock()
 68
 69    '设置权重参数的初始值'
 70
 71    theta = np.zeros(xcols)
 72
 73    '迭代步数'
 74
 75    iters = 0;
 76
 77    '记录代价函数的值'
 78
 79    cost_record=[]
 80
 81    '学习率'
 82
 83    sigma = 0.01
 84
 85    cost_val = cost(m,theta,X,y)
 86
 87    cost_record.append(cost_val)
 88
 89    while True:
 90
 91        grad = gradient(m,theta,X,y,xcols)
 92
 93        '参数更新'
 94
 95        theta = theta_update(grad,theta,sigma)
 96
 97        cost_update = cost(m,theta,X,y)
 98
 99        if stop_stratege(cost_val,cost_update,threshold):
100
101            break
102
103        iters=iters+1
104
105        cost_val = cost_update
106
107        print("cost_val:%f" %cost_val)
108
109        cost_record.append(cost_val)
110
111    end = time.clock()
112
113    print("LogicRegressionconvergence duration: %f s" % (end - start))
114
115    return cost_record, iters,theta

3 分析结果

调用逻辑回归函数:LogicRegression(data[:,[0,1,2]],data[:,3],0.00001,200,3)

结果显示经过,逻辑回归梯度下降经过如下时间得到初步收敛,LogicRegression convergence duration:18.076398 s,经过 56172万 多个时步迭代,每个时步计算代价函数的取值,如下图所示:

收敛时,得到的权重参数为:

1array([ 0.48528656,  9.48593954, -9.42256868])  

参数的含义:第一个权重参数为偏置项,第二、三个权重参数相当,只不过贡献方向相反而已。

下面画出,二分类的决策边界,

1plt.scatter(x1_pos,x2_pos)
2
3plt.scatter(x1_neg,x2_neg)
4
5wp = np.linspace(0.0,1.0,200)
6
7plt.plot(wp,-(theta[0]+theta[1]*wp)/theta[2],color='g')
8
9plt.show()

可以看到分类效果非常不错。

如果你对文章感兴趣,同样这个星球会帮助到你,欢迎加入。

原文发布于微信公众号 - Python与机器学习算法频道(alg-channel)

原文发表时间:2018-10-13

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏人工智能LeadAI

R-CNN目标检测第三弹(Faster R-CNN)

今天,重看了 R-CNN 的终极改进版本 Faster R-CNN(NIPS 版)-本文提到的paper,若为特别指明,说的就是此版本。 先说一个学术趣事吧,...

4218
来自专栏杨熹的专栏

Logistic regression 为什么用 sigmoid ?

1333
来自专栏数据派THU

独家 | 初学者的问题:在神经网络中应使用多少隐藏层/神经元?(附实例)

本文将通过两个简单的例子,讲解确定所需隐藏层和神经元数量的方法,帮助初学者构建神经网络。

2210
来自专栏新智元

【干货】随机森林的Python实现

【新智元导读】在机器学习中,随机森林是一个包含多个决策树的分类器,并且其输出的类别是由个别树输出的类别的众数而定。随机森林几乎是任何预测类问题(甚至非线性问题)...

3725
来自专栏机器学习和数学

[编程经验] TensorFlow实现线性支持向量机SVM

[点击蓝字,一键关注~] 今天要说的是线性可分情况下的支持向量机的实现,如果对于平面内的点,支持向量机的目的是找到一条直线,把训练样本分开,使得直线到两个样本的...

3884
来自专栏机器之心

学界 | 谷歌大脑提出自动数据增强方法AutoAugment:可迁移至不同数据集

2509
来自专栏新智元

从0上手Kaggle图像分类挑战:冠军解决方案详解

【新智元导读】这篇文章介绍了作者在Kaggle植物幼苗分类比赛使用的方法,该方法连续几个月排名第一,最终排名第五。该方法非常通用,也可以用于其他图像识别任务。

1970
来自专栏瓜大三哥

CNN-3DMM extimation(0.9235)

当在真实场景中应用3d模拟来增加人脸识别精度,存在两类问题:要么3d模拟不稳定,导致同一个个体的3d模拟差异较大;要么过于泛化,导致大部分合成的图片都累死。因此...

35610
来自专栏Petrichor的专栏

论文阅读: Speed/accuracy trade-offs

版权声明:转载请注明出处 https://blog.csdn.net/JNingWei/article/details/80045857 ...

2225
来自专栏xingoo, 一个梦想做发明家的程序员

吴恩达机器学习笔记 —— 2 单变量线性回归

机器学习的过程就是通过上面的例子学习一个模型,当再次有数据x进来的时候,能给出对应的y值

830

扫码关注云+社区