一、概率

  在引入问题前,我们先复习下数学里面关于概率的基本概念

  概率:对一件事发生的可能性衡量

  范围:0<=P<=1

  计算方法:根据个人置信区间;根据历史数据;根据模拟数据。

  条件概率:B发生的条件下,A发生的概率

  

二、Logistic Regression(逻辑回归)

1、问题引入

  处理二值数据时,如果一直8个测试数据集为如下所示,我们利用线性回归方程,建立回归方程曲线,图形显示,并不能很好的模拟回归问题,也就是我们所说的欠回归。

  

  如果继续引入第9个测试点,我们发现欠回归情况更加严重,因此我们需要引入一个新的回归模型,来解决该类模型欠回归问题。

  

2、简单推导过程

  假设测试数据为X(x0,x1,x2···xn)

  要学习的参数为:Θ(θ0,θ1,θ2,···θn)

向量表示:

  观察Logistic函数曲线,我们发现在0到负无穷时,函数值趋向于0,0到正无穷时函数曲线趋向于1,且当z等于0时,函数值为0.5,于是我们可以引入该函数,对预测方程进行再次转换,由数值上的计算转换为0,1概率上的计算,即:

  

  

不同于线性回归模型:,定义一个新的预测函数为:

  于是问题从对Z函数求最优theta参数值,变为对h函数求最优theta参数值。对二值问题,可转换为如下表述:

  

根据一般方法,首先定义新的cost函数,然后根据cost函数来反向更新参数theta值,如下为新的cost函数:

  

为了计算方便,我们对其转化为:

两个式子可以进行合并,最终化简为最终的cost函数:

该式为非线性方程,通过求导来计算极值很复杂,我们引入之前的梯度下降算法,来不断的估计新的参数值

最终更新法则为:

3、实际编程应用

  如下为一个通用的非线性回归方程,在利用梯度下降算法反向更新theta参数值时,没有使用如下更新法则,而是使用通用方法,如下是具体代码:

  

import numpy as np
import random # 梯度下降算法来更新参数值
# x,y:测试数据集及标签值,theta:学习的参数值,alpha:学习率,m:测试数据集个数,numIterations:重复更新次数
def gradientDescent(x,y,theta,alpha,m,numIterations):
xTrans = np.transpose(x)
for i in range(0,numIterations):
hypothesis = np.dot(x,theta)
loss = hypothesis - y
# 定义一个通用的更新法则7
cost = np.sum(loss**2)/(2*m)
if i % 10000 == 0:
print("Iteration %d | Cost:%f"%(i,cost))
gradient = np.dot(xTrans,loss)/m
theta = theta - alpha*gradientreturn theta # 生成测试数据
# numPoints:测试数据集行数,bias:偏向,variance:方差
def genData(numPoints,bias,variance):
x = np.zeros(shape=(numPoints,2))
y = np.zeros(shape=numPoints)
for i in range(0,numPoints):
x[i][0] = 1
x[i][1] = i
# uniform随机产生一些数字
y[i] = (i + bias) + random.uniform(0,1) + variance
return x,y x,y = genData(100,25,10)
m,n = np.shape(x)
print(x,y)
theta = np.ones(n)
alpha = 0.0005
theta = gradientDescent(x,y,theta,alpha,m,100000)
print(theta)

  最终的结果如下,结果显示,随着训练次数的增加,目标函数也在不断的减小:

  

最新文章

  1. 分布式文件系统 - FastDFS 在 CentOS 下配置安装部署
  2. 安装zabbix,make的时候报错
  3. jQuery源代码学习之四——jQuery.callbacks
  4. 转:&quot;在已损坏了程序内部状态的XXX.exe 中发生了缓冲区溢出&quot;的一种可能原因
  5. IO流 总结二
  6. [ActionScript 3.0] AS3 访问舞台上元件的方法
  7. Oracle自带的用户
  8. Java 多线程同步的五种方法
  9. eclipse3.2 汉化 汉化包下载
  10. 【Python@Thread】Semaphore&amp;糖果机
  11. 搭建本地 Registry - 每天5分钟玩转 Docker 容器技术(20)
  12. flex sqlite基本用法
  13. Oracle实战笔记(第四天)
  14. 用js实现左右阴影的切换
  15. oracle 计算机改名后监听无法启动
  16. Teradata全面转型
  17. linux下设置php执行命令
  18. 『转』VC++ webbrowser函数使用范例
  19. C#实现Google S2算法
  20. nginx 和php设置上传大小及可以提交的内容限制

热门文章

  1. android ListView 与GridView 学习总结(五)
  2. redis介绍及在购物车项目中的应用,用户认证
  3. Controller类的方法上的RequestMapping一定要写在Controller类里吗?
  4. SpringBoot非官方教程 | 第十篇: 用spring Restdocs创建API文档
  5. POJ 1113--Wall(计算凸包)
  6. 使用Python操作Office——EXCEL
  7. (第02节)集成Sping框架
  8. web前端总结面试问题(理论)
  9. MySQL wait_timeout参数修改
  10. Java HotSpot(TM) 64-Bit Server VM warning: INFO: os::commit_memory(0x0000000