逻辑回归以及初探决策边界

学习到如何读取数据后,我趁热打铁,今天早上实现了逻辑回归的牛顿下降方法。废话不多讲了,下面开始我的实现过程。我会分模块儿展示代码。

下面说明数据集ex4x.dat,ex4y.dat,它们是两次考试的成绩与最终被大学录取之间的关系。

ex4x.dat:两次测试的成绩,第一列为测试1,第二列为测试2

ex4y.dat:录取与否,0代表未录取,1代表录取

展示前的预备知识,逻辑回归无非就是多了一块儿sigmoid函数的知识:

sigmoid函数的公式如下,至于为什么使用sigmoid函数,原因在于它的性质,读者可自行查阅资料。

g(z)=\frac{1}{1+e^{-z}}

牛顿法的公式为:

\theta^{t+1}=\theta^t-H^{-1}\frac{\partial J}{\partial \theta}

H为海森矩阵,就是J对\theta的两阶导数

\frac{\partial J}{\partial \theta}=X(h(X)-Y)/m

H=E(X^{T}X)/m(E是单位阵)

展示代码:


import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import cmath as math
X=pd.read_table('C:\\Users\\zhanghongqing\\Desktop\\python\\逻辑回归\\ex4Data\\ex4x.dat',sep='\s+')
Y=pd.read_table('C:\\Users\\zhanghongqing\\Desktop\\python\\逻辑回归\\ex4Data\\ex4y.dat',sep='\s+')
X=np.array(X)
Y=np.array(Y)
m=X.shape[0]#行数
a=np.ones((m,1))
X=np.hstack((a,X))
n=X.shape[1]#列数
#find函数是指在满足条件下的位置,返回一个位置矩阵
def find(condition):
    res=np.nonzero(condition)
    return res
#区分数据集,0未录取,1录取
pos=find(Y==1)
neg=find(Y==0)
#画出录取与未录取的散点图
plt.figure(num=0)
plt.scatter(X[pos[0],1],X[pos[0],2],marker='+')
plt.scatter(X[neg[0],1],X[neg[0],2],marker='o')
plt.xlabel('Exam1 scores')
plt.ylabel('Exam2 scores')
plt.legend(['Admitted','Not admitted'])
plt.show()
theta=np.ones((n,1))
def sigmoid(z):#定义sigmoid函数
    return 1/(1+np.exp(-z))
def h(curentX):#定义假设函数
    return sigmoid(np.dot(curentX,theta))
def lostfunction(theta):#定义损失函数
    return sum(-np.log(h(X[pos[0],1:3],theta)))+sum(-np.log(1-h(X[neg[0],1:3],theta)))
def f1():#一阶导数
    return np.dot(X.T,h(X)-Y)/m
def H():#海森矩阵
    sum=np.eye(theta.shape[0])
    sum=np.dot(sum,np.dot(X.T,X))/m
    return sum
es=1e-12#定义一个变化量,使得牛顿法在小于该误差后停止迭代
def newtonmethod():#牛顿法
    global theta
    k=np.ones((theta.shape[0],1))
    while (abs(k)>es).all():#k>es为了使得变化量小于某个值,注意坑要使用abs确保符号
        k=np.dot(np.linalg.inv(H()),f1())#inv()求逆矩阵
        theta=theta-k
newtonmethod()
#print(theta)
#为了画出theta*X=0的直线,要解出点
x1=np.array([i+10 for i in np.arange(60)])
x2=-(theta[0]+theta[1]*x1)/theta[2]
#画出点和决策边界
plt.figure(num=1)
plt.scatter(X[pos[0],1],X[pos[0],2],marker='+')
plt.scatter(X[neg[0],1],X[neg[0],2],marker='o')
plt.plot(x1,x2,'b-')
plt.xlabel('Exam1 scores')
plt.ylabel('Exam2 scores')
plt.legend(['Admitted','Not admitted','Decison boundary'])
plt.show()
还可使用等高线图
plt.figure(num=2)
plt.scatter(X[pos[0],1],X[pos[0],2],marker='+')
plt.scatter(X[neg[0],1],X[neg[0],2],marker='o')
ct=plt.contour(wx,wy,z,3,label='Decison boundary')
plt.clabel(ct,inline=true)
plt.xlabel('Exam1 scores')
plt.ylabel('Exam2 scores')
plt.legend(['Admitted','Not admitted','Decison boundary'])
plt.show()

图片展示

 

总结:逻辑回归比起线性回归基本上只多了一个sigmoid函数。并且有了逻辑回归后我们就需要区分两类点集了。

ex4x.dat

   5.5500000e+01   6.9500000e+01
   4.1000000e+01   8.1500000e+01
   5.3500000e+01   8.6000000e+01
   4.6000000e+01   8.4000000e+01
   4.1000000e+01   7.3500000e+01
   5.1500000e+01   6.9000000e+01
   5.1000000e+01   6.2500000e+01
   4.2000000e+01   7.5000000e+01
   5.3500000e+01   8.3000000e+01
   5.7500000e+01   7.1000000e+01
   4.2500000e+01   7.2500000e+01
   4.1000000e+01   8.0000000e+01
   4.6000000e+01   8.2000000e+01
   4.6000000e+01   6.0500000e+01
   4.9500000e+01   7.6000000e+01
   4.1000000e+01   7.6000000e+01
   4.8500000e+01   7.2500000e+01
   5.1500000e+01   8.2500000e+01
   4.4500000e+01   7.0500000e+01
   4.4000000e+01   6.6000000e+01
   3.3000000e+01   7.6500000e+01
   3.3500000e+01   7.8500000e+01
   3.1500000e+01   7.2000000e+01
   3.3000000e+01   8.1500000e+01
   4.2000000e+01   5.9500000e+01
   3.0000000e+01   6.4000000e+01
   6.1000000e+01   4.5000000e+01
   4.9000000e+01   7.9000000e+01
   2.6500000e+01   6.4500000e+01
   3.4000000e+01   7.1500000e+01
   4.2000000e+01   8.3500000e+01
   2.9500000e+01   7.4500000e+01
   3.9500000e+01   7.0000000e+01
   5.1500000e+01   6.6000000e+01
   4.1500000e+01   7.1500000e+01
   4.2500000e+01   7.9500000e+01
   3.5000000e+01   5.9500000e+01
   3.8500000e+01   7.3500000e+01
   3.2000000e+01   8.1500000e+01
   4.6000000e+01   6.0500000e+01
   3.6500000e+01   5.3000000e+01
   3.6500000e+01   5.3500000e+01
   2.4000000e+01   6.0500000e+01
   1.9000000e+01   5.7500000e+01
   3.4500000e+01   6.0000000e+01
   3.7500000e+01   6.4500000e+01
   3.5500000e+01   5.1000000e+01
   3.7000000e+01   5.0500000e+01
   2.1500000e+01   4.2000000e+01
   3.5500000e+01   5.8500000e+01
   2.6500000e+01   6.8500000e+01
   2.6500000e+01   5.5500000e+01
   1.8500000e+01   6.7000000e+01
   4.0000000e+01   6.7000000e+01
   3.2500000e+01   7.1500000e+01
   3.9000000e+01   7.1500000e+01
   4.3000000e+01   5.5500000e+01
   2.2000000e+01   5.4000000e+01
   3.6000000e+01   6.2500000e+01
   3.1000000e+01   5.5500000e+01
   3.8500000e+01   7.6000000e+01
   4.0000000e+01   7.5000000e+01
   3.7500000e+01   6.3000000e+01
   2.4500000e+01   5.8000000e+01
   3.0000000e+01   6.7000000e+01
   3.3000000e+01   5.6000000e+01
   5.6500000e+01   6.1000000e+01
   4.1000000e+01   5.7000000e+01
   4.9500000e+01   6.3000000e+01
   3.4500000e+01   7.2500000e+01
   3.2500000e+01   6.9000000e+01
   3.6000000e+01   7.3000000e+01
   2.7000000e+01   5.3500000e+01
   4.1000000e+01   6.3500000e+01
   2.9500000e+01   5.2500000e+01
   2.0000000e+01   6.5500000e+01
   3.8000000e+01   6.5000000e+01
   1.8500000e+01   7.4500000e+01
   1.6000000e+01   7.2500000e+01
   3.3500000e+01   6.8000000e+01
ex4y.dat

   1.0000000e+00
   1.0000000e+00
   1.0000000e+00
   1.0000000e+00
   1.0000000e+00
   1.0000000e+00
   1.0000000e+00
   1.0000000e+00
   1.0000000e+00
   1.0000000e+00
   1.0000000e+00
   1.0000000e+00
   1.0000000e+00
   1.0000000e+00
   1.0000000e+00
   1.0000000e+00
   1.0000000e+00
   1.0000000e+00
   1.0000000e+00
   1.0000000e+00
   1.0000000e+00
   1.0000000e+00
   1.0000000e+00
   1.0000000e+00
   1.0000000e+00
   1.0000000e+00
   1.0000000e+00
   1.0000000e+00
   1.0000000e+00
   1.0000000e+00
   1.0000000e+00
   1.0000000e+00
   1.0000000e+00
   1.0000000e+00
   1.0000000e+00
   1.0000000e+00
   1.0000000e+00
   1.0000000e+00
   1.0000000e+00
   1.0000000e+00
   0.0000000e+00
   0.0000000e+00
   0.0000000e+00
   0.0000000e+00
   0.0000000e+00
   0.0000000e+00
   0.0000000e+00
   0.0000000e+00
   0.0000000e+00
   0.0000000e+00
   0.0000000e+00
   0.0000000e+00
   0.0000000e+00
   0.0000000e+00
   0.0000000e+00
   0.0000000e+00
   0.0000000e+00
   0.0000000e+00
   0.0000000e+00
   0.0000000e+00
   0.0000000e+00
   0.0000000e+00
   0.0000000e+00
   0.0000000e+00
   0.0000000e+00
   0.0000000e+00
   0.0000000e+00
   0.0000000e+00
   0.0000000e+00
   0.0000000e+00
   0.0000000e+00
   0.0000000e+00
   0.0000000e+00
   0.0000000e+00
   0.0000000e+00
   0.0000000e+00
   0.0000000e+00
   0.0000000e+00
   0.0000000e+00
   0.0000000e+00
 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值