背景与原理:

线性回归可以实现对连续结果的预测,但是现实生活中我们常见的另一种问题是分类问题,尤其是二分类问题,在这种情况下使用线性回归就不太合适了,我们实际上需要计算出的是一个在$[0,1]$之间的概率来告诉我们某样本属于某一类的概率,因此逻辑回归应运而生。

一般的逻辑回归就是在线性回归的基础上嵌套一个逻辑函数,把线性回归的结果转换成概率。

即我们定义$h_{\theta}(X)=P(y=1|X,\theta),1-h_{\theta}(X)=P(y=0|X,\theta)$,那么我们希望最大化预测正确的概率,即我们要最大化:

$\prod_{i=1}^{m}P(y=y_{i}|X_{i},\theta)$

那么也就是:

$\prod_{i=1}^{m}(h_{\theta}(X_{i})^{y_{i}}(1-h_{\theta}(X_{i}))^{1-y_{i}}$

这不好计算,两侧取对数再去取相反数就得到:

$J(\theta)=-\dfrac{1}{m}\sum_{i=1}^{m}y_{i}\log h_{\theta}(X_{i})+(1-y_{i})\log (1-h_{\theta}(X_{i}))$

这样我们只需最小化这个损失函数就可以了,仍然使用梯度下降法确定参数,我们有:

$\hat{\theta_{j}}=\theta_{j}-\alpha \dfrac{\partial J(\theta)}{\partial \theta_{j}}$

对上式求偏导,最后我们得到:

$\hat{\theta_{j}}=\theta_{j}-\alpha \dfrac{1}{m}\sum_{i=1}^{m}(h_{\theta}(X_{i})-y_{i})x_{ij}$

而我们的操作是在线性模型的基础上套上一个逻辑模型,也即我们的参数仍然是线性模型的参数$\theta$:

$z=\theta^{T}X$

在这个基础上套上一个逻辑函数,这里我们选择的是sigmoid函数,即:

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

于是我们最后的函数即为:

$h_{\theta}=\dfrac{1}{1+e^{-\theta^{T}X}}$

代码实现:

import numpy as np
import math
from scipy import stats
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression def sigmoid(z):
return 1/(1+math.exp(-z)) def logical_regression(X,Y,theta,siz,alpha,eps):
delt=1 while delt>eps:
new_theta=np.zeros(3)
for i in range(0,3):
r=theta[i]
for j in range(0,siz):
d=alpha/siz*(sigmoid(theta[0]*X[0][j]+theta[1]*X[1][j]+theta[2]*X[2][j])-Y[j])*X[i][j]
r-=d
new_theta[i]=r
print(new_theta[i])
delta=new_theta-theta
delt=delta[0]**2+delta[1]**2+delta[2]**2
theta=new_theta
return theta x=np.arange(0.,10.,0.02)
y=5-2*x/3+np.random.randn(500)
now=0
dataset=[]
for i in range(0,500):
typ = 0
if 2*x[i]+3*y[i] <= 15:
if abs(np.random.randn(1)[0])<2:
typ = 1
else:
typ = 0
else:
if abs(np.random.randn(1)[0]) < 2:
typ = 0
else:
typ = 1 dataset.append([x[i],y[i],typ]) X=(np.array(dataset)[:,0:2]).T
x0=np.ones(500)
X=np.vstack([x0,X])
Y=(np.array(dataset)[:,2])
theta=np.array([1,1,1]) my_theta=logical_regression(X,Y,theta,500,1e-2,1e-7) print(my_theta) for i in range(0,500):
if Y[i]==1:
plt.scatter(X[1,i],X[2,i],c='r')
else:
plt.scatter(X[1,i],X[2,i],c='b')
plt.plot(x,-my_theta[1]/my_theta[2]*x-my_theta[0]/my_theta[2],c='g',linewidth=3)
plt.show()

这个代码生成了一组以直线$2x+3y-15=0$为分界的数据,并且加入了一定的随机化,最后通过逻辑回归能够找出这条直线,当然这里的参数选取同样也很重要

小结与优化:

逻辑回归中在一定程度上存在欠拟合的问题,因为很多时候分界线并不是直线而是曲线,此时单纯的线性函数已经无法拟合边界了,一个解决方案是引入更多维度,比如把$[x_{1},x_{2}]$扩展成$[x_{1},x_{2},x_{1}^{2},x_{2}^{2}]$,这样就可以更好拟合二次曲线形成的边界,以此类推等。

而精度问题则可能是由于数据特征有缺失或数据空间太大等,遇到这种情况可以加入正则化的一项使模型缩减系数,有利于提高模型的泛化能力。

python机器学习——逻辑回归方法的更多相关文章

  1. 吴裕雄 python 机器学习——逻辑回归

    import numpy as np import matplotlib.pyplot as plt from matplotlib import cm from mpl_toolkits.mplot ...

  2. python机器学习-逻辑回归

    1.逻辑函数 假设数据集有n个独立的特征,x1到xn为样本的n个特征.常规的回归算法的目标是拟合出一个多项式函数,使得预测值与真实值的误差最小: 而我们希望这样的f(x)能够具有很好的逻辑判断性质,最 ...

  3. python机器学习——逻辑回归

    我们知道感知器算法对于不能完全线性分割的数据是无能为力的,在这一篇将会介绍另一种非常有效的二分类模型--逻辑回归.在分类任务中,它被广泛使用 逻辑回归是一个分类模型,在实现之前我们先介绍几个概念: 几 ...

  4. 机器学习_线性回归和逻辑回归_案例实战:Python实现逻辑回归与梯度下降策略_项目实战:使用逻辑回归判断信用卡欺诈检测

    线性回归: 注:为偏置项,这一项的x的值假设为[1,1,1,1,1....] 注:为使似然函数越大,则需要最小二乘法函数越小越好 线性回归中为什么选用平方和作为误差函数?假设模型结果与测量值 误差满足 ...

  5. 机器学习---逻辑回归(二)(Machine Learning Logistic Regression II)

    在<机器学习---逻辑回归(一)(Machine Learning Logistic Regression I)>一文中,我们讨论了如何用逻辑回归解决二分类问题以及逻辑回归算法的本质.现在 ...

  6. 机器学习/逻辑回归(logistic regression)/--附python代码

    个人分类: 机器学习 本文为吴恩达<机器学习>课程的读书笔记,并用python实现. 前一篇讲了线性回归,这一篇讲逻辑回归,有了上一篇的基础,这一篇的内容会显得比较简单. 逻辑回归(log ...

  7. 机器学习之使用Python完成逻辑回归

    一.任务基础 我们将建立一个逻辑回归模型来预测一个学生是否被大学录取.假设你是一个大学系的管理员,你想根据两次考试的结果来决定每个申请人的录取机会.你有以前的申请人的历史数据,你可以用它作为逻辑回归的 ...

  8. 机器学习——逻辑回归(Logistic Regression)

    1 前言 虽然该机器学习算法名字里面有"回归",但是它其实是个分类算法.取名逻辑回归主要是因为是从线性回归转变而来的. logistic回归,又叫对数几率回归. 2 回归模型 2. ...

  9. python机器学习《回归 一》

    唠嗑唠嗑 依旧是每一次随便讲两句生活小事.表示最近有点懒,可能是快要考试的原因,外加这两天都有笔试和各种面试,让心情变得没那么安静的敲代码,没那么安静的学习算法.搞得第一次和技术总监聊天的时候都不太懂 ...

  10. 机器学习---逻辑回归(一)(Machine Learning Logistic Regression I)

    逻辑回归(Logistic Regression)是一种经典的线性分类算法.逻辑回归虽然叫回归,但是其模型是用来分类的. 让我们先从最简单的二分类问题开始.给定特征向量x=([x1,x2,...,xn ...

随机推荐

  1. mongodb-命令小结

    小白暂时在这里记录些涉及到的 在某条记录添加一个字段: 先查询_id: db.subscriptions.find({"channel":"parking.notify. ...

  2. Kubernetes二进制安装

    目录: 操作系统初始化配置 部署docker引擎 部署etcd集群 准备签发证书环境 部署Master组件 部署Worker Node组件 部署CNI网络组件 部署flannel 部署Calico 部 ...

  3. 3、app自动化:使用appium定位元素的方式及元素的常用操作

    前提: 没有的包,要先进行对应包的安装 如:pip install Appium-Python-Client 一.定位元素,包括属性定位和xpath定位方式 a\属性定位 属性 定位方式     示例 ...

  4. css3中-webkit是什么意思

    在CSS样式中很多样式名前缀都带有'-webkit-',但在CSS提供的API中查询不到这些样式名. 原因:CSS3中新增了一些属性,针对不同的浏览器,规定其内核名称让它们可以对这些新增属性进行解析. ...

  5. Django项目的创建、启动、停止

    1. 首先安装Django的包 pip install Django 的命令安装包 2. 配置环境变量,必须配置,后边需要用到django的命令,这个包和别的包不太一样的地方 C:\Users**** ...

  6. java使用MVC编程模型实现1+到100图形界面

    MVC概念 MVC编程模型是可以说从提出到现在经久不败,是一种先进的设计结构.能很好的体现个人分工,从而实现前后端分离. M(Model):模型:存储数据的对象.后端操作数据库的. V(View):视 ...

  7. CUDA的新功能

    CUDA 9: 配合Volta架构推出: 1. 新的多线程编程范式.Cooperative Groups 2. 优化算法库 CUDA10: 配合Turing架构推出. 1. 新增了对TensorCor ...

  8. apt-get update 报错 Repository ' InRelease' changed its 'Suite' value from 'stable' to 'oldstable'

    问题截图: 解决方案: apt-get update --allow-releaseinfo-change

  9. mplfinance常用方法

    一.主题相关 查看可用预设主题 mpf.available_styles() 默认的主题包括:'binance','blueskies','brasil','charles','checkers',' ...

  10. matplotlib 中文乱码的解决方法

    关于报错信息 Glyph 26426 missing from current font. 这个错误的原因是:本地没有可支持中文字体显示的配置文件,所以第一步需要先去下载相关的配置文件. 下载链接 h ...