赞
踩
Hello大家!上一篇小A已经详细的为大家讲解了逻辑回归的原理和数学推导,但是对于学习人工智能来说仅仅学会原理是远远不够的,还必须要动手实践,必须要学会使用编程语言将算法实现。所以,今天我就来为大家展示一下使用python进行逻辑回归的实现。
在实现之前,先来解答一下大家对于上一篇的问题
1.
有人疑惑这里第四行为什么是根据sigmod求导公式进行推导,明明是hw函数。
上一篇我们看到hw函数的形式:
而我们看到sigmod函数形式可以变换为:
与hw函数形式一样,所以可以根据sigmod函数进行变换。
2. 逻辑回归的目标函数为什么是凸函数
我们知道凹凸函数的判别方法如下所示:
而逻辑回归目标函数的一阶偏导如下所示:
注意这里L(w)是逻辑回归的目标函数,非损失函数,所以式子前面没有负号。
我们来求逻辑回归目标函数的二阶偏导:
由此可得逻辑回归目标函数是凸函数。
以上是上一篇文章在发出后,一些读者发来的问题,已做详细解答。接下来让我们来使用python编程语言来对逻辑回归进行实现。
1. 首先加载数据
我们首先看一下数据格式:
-0.017612 14.053064 0
-1.395634 4.662541 1
-0.752157 6.538620 0
-1.322371 7.152853 0
0.423363 11.054677 0
0.406704 7.067335 1
0.667394 12.741452 0
-2.460150 6.866805 1
0.569411 9.548755 0
-0.026632 10.427743 0
前两列是属性列,也是我们需要输入的数据,最后一列是分类label。
接下来加载数据:
注意data.append([1.0,float(lineArray[0]),float(lineArray[1])])这里的1.0是w^T+b中b前面的系数1。是为了方便后面的权重矩阵与输入数据X相乘而设置。(1*b+w1*x1+w2*x2...+wn*xn)
这里的label是标签
2.定义sigmod函数
3. 定义梯度
我们的目的是为了使得目标函数最大,这里对目标函数求偏导即为梯度等于:
所以代码可表示为:
这里h代表hw,q代表梯度,dataMatrix代表xi。
4. 目标函数为凸函数,梯度上升法求解未知数w和b(b已被w吸收进矩阵,统一求w)
这里把权重(w0,w1,w2...wn)统一初始化为一,当梯度接近于0时,目标函数到达极点,此时weight即为我们要求的值。
5. 最后画出图形
完整代码如下:
#-*- coding:UTF-8 -*-
from numpy import *
filename='logistic_text.txt'
def loadDataSet():
data = []
label = []
fr = open(filename)
for line in fr.readlines():
lineArray = line.strip().split()
data.append([1.0, float(lineArray[0]), float(lineArray[1])]) 2*X1+W3*X2
label.append(int(lineArray[2]))
return data,label
def sigmoid(X):
return 1.0/(1+exp(-X))
alpha = 0.001
def gradient(weights,data,label):
dataMatrix = mat(data)
classLabels = mat(label).transpose()
h = sigmoid(dataMatrix * weights)
error = (classLabels - h)
q = -dataMatrix.transpose() * error
return q
def gradient_Accent(data, label):
m, n = shape(data)
weights = ones((n, 1))
q=gradient(weights,data,label)
while not all(absolute(q) <= 2e-5):
weights = weights - alpha * q
q = gradient(weights,data, label)
return weights
def plotBestFit(weights): #画出最终分类的图
import matplotlib.pyplot as plt
dataMat,labelMat=loadDataSet()
dataArr = array(dataMat)
n = 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 = arange(-3.0, 3.0, 0.1)
y = (-weights[0]-weights[1]*x)/weights[2]
ax.plot(x, y)
plt.xlabel('X1')
plt.ylabel('X2')
plt.show()
def main():
dataMat, labelMat = loadDataSet()
weights=gradient_Accent(dataMat, labelMat).getA()
plotBestFit(weights)
if __name__=='__main__':
main()
使用的数据如下所示,读者将其存储为txt文件即可使用:
-0.017612 14.053064 0 -1.395634 4.662541 1 -0.752157 6.538620 0 -1.322371 7.152853 0 0.423363 11.054677 0 0.406704 7.067335 1 0.667394 12.741452 0 -2.460150 6.866805 1 0.569411 9.548755 0 -0.026632 10.427743 0 0.850433 6.920334 1 1.347183 13.175500 0 1.176813 3.167020 1 -1.781871 9.097953 0 -0.566606 5.749003 1 0.931635 1.589505 1 -0.024205 6.151823 1 -0.036453 2.690988 1 -0.196949 0.444165 1 1.014459 5.754399 1 1.985298 3.230619 1 -1.693453 -0.557540 1 -0.576525 11.778922 0 -0.346811 -1.678730 1 -2.124484 2.672471 1 1.217916 9.597015 0 -0.733928 9.098687 0 -3.642001 -1.618087 1 0.315985 3.523953 1 1.416614 9.619232 0 -0.386323 3.989286 1 0.556921 8.294984 1 1.224863 11.587360 0 -1.347803 -2.406051 1 1.196604 4.951851 1 0.275221 9.543647 0 0.470575 9.332488 0 -1.889567 9.542662 0 -1.527893 12.150579 0 -1.185247 11.309318 0 -0.445678 3.297303 1 1.042222 6.105155 1 -0.618787 10.320986 0 1.152083 0.548467 1 0.828534 2.676045 1 -1.237728 10.549033 0 -0.683565 -2.166125 1 0.229456 5.921938 1 -0.959885 11.555336 0 0.492911 10.993324 0 0.184992 8.721488 0 -0.355715 10.325976 0 -0.397822 8.058397 0 0.824839 13.730343 0 1.507278 5.027866 1 0.099671 6.835839 1 -0.344008 10.717485 0 1.785928 7.718645 1 -0.918801 11.560217 0 -0.364009 4.747300 1 -0.841722 4.119083 1 0.490426 1.960539 1 -0.007194 9.075792 0 0.356107 12.447863 0 0.342578 12.281162 0 -0.810823 -1.466018 1 2.530777 6.476801 1 1.296683 11.607559 0 0.475487 12.040035 0 -0.783277 11.009725 0 0.074798 11.023650 0 -1.337472 0.468339 1 -0.102781 13.763651 0 -0.147324 2.874846 1 0.518389 9.887035 0 1.015399 7.571882 0 -1.658086 -0.027255 1 1.319944 2.171228 1 2.056216 5.019981 1 -0.851633 4.375691 1 -1.510047 6.061992 0 -1.076637 -3.181888 1 1.821096 10.283990 0 3.010150 8.401766 1 -1.099458 1.688274 1 -0.834872 -1.733869 1 -0.846637 3.849075 1 1.400102 12.628781 0 1.752842 5.468166 1 0.078557 0.059736 1 0.089392 -0.715300 1 1.825662 12.693808 0 0.197445 9.744638 0 0.126117 0.922311 1 -0.679797 1.220530 1 0.677983 2.556666 1 0.761349 10.693862 0 -2.168791 0.143632 1 1.388610 9.341997 0 0.317029 14.739025 0
另外python中sklearn封装有 LogisticRegression,直接调用即可:
logr = LogisticRegression()
logr.fit(X_train,y_train)
print("准确度:",logr.score(X_test,y_test))
以上即为python对逻辑回归的实现,你学会了吗?
如下是本人学习公众号,会经常分享人工智能学习总结或者分享学习资料资源,欢迎大家关注,我们一起交流学习~
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。