day-13 python库实现简单非线性回归应用
一、概率
在引入问题前,我们先复习下数学里面关于概率的基本概念
概率:对一件事发生的可能性衡量
范围: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)
最终的结果如下,结果显示,随着训练次数的增加,目标函数也在不断的减小:

day-13 python库实现简单非线性回归应用的更多相关文章
- C# 调用Python库 最简单方法
起个头,技术性文章应该言简意赅(因我看到外国回答问题都是可以一句代码解决的,绝不会写第二句),实现功能无误再贴出文章. 首先我不用 IronPython来写这个.py文件,因为我有Pycharm,而且 ...
- python GUI实战项目——tkinter库的简单实例
一.项目说明: 本次通过实现一个小的功能模块对Python GUI进行实践学习.项目来源于软件制造工程的作业.记录在这里以复习下思路和总结编码过程.所有的源代码和文件放在这里: 链接: https:/ ...
- python requests库的简单运用
python requests的简单运用 使用pycharm获取requests包 ctrl+alt+s Project:pythonProject pythoninterpreter 点+号搜索 使 ...
- 11个并不广为人知,但值得了解的Python库
这是一篇译文,文中提及了一些不常见但是有用的Python库 原文地址:http://blog.yhathq.com/posts/11-python-libraries-you-might-not-kn ...
- 13.python笔记之pyyaml模块
Date:2016-03-25 Title:13.Python笔记之Pyymal模块使用 Tags:Python Category:Python 博客地址:www.liuyao.me 作者:刘耀 YA ...
- 你可能没听过的11个Python库
目前,网上已有成千上万个Python包,但几乎没有人能够全部知道它们.单单 PyPi上就有超过47000个包列表. 现在,越来越多的数据科学家开始使用Python,虽然他们从 pandas, scik ...
- Python 库/模块/工具收集
1 算法 1.1 字符串处理 re 正则表达式的标准库. StringIO / cStringIO 以读写文件的方式来操作字符串(有点类似于内存文件). cStringIO 是 C 语言实现的,提供高 ...
- python之pandas简单介绍及使用(一)
python之pandas简单介绍及使用(一) 一. Pandas简介1.Python Data Analysis Library 或 pandas 是基于NumPy 的一种工具,该工具是为了解决数据 ...
- 1.3 Essential Python Libraries(一些重要的Python库)
1.3 Essential Python Libraries(一些重要的Python库) 如果不了解Python的数据生态,以及本书中即将用到的一些库,这里会做一个简单的介绍: Numpy 这里就不过 ...
随机推荐
- webapi是如何绑定参数的(How WebAPI does Parameter Binding)
原文地址 由于工作原因,要使用ASP.NET WEBAPI(非mvc webapi),前几天时间一直很紧张,所以webapi一直将就用,今天下午好不容易有时间终于看了下,解决了自己一直疑惑的问题,在此 ...
- vue使用v-for循环,动态修改element-ui的el-switch
在使用element-ui的el-switch中,因为要用v-for循环,一直没有成功,后来仔细查看文档,发现可以这样写 <el-switch v-for="(item, key) i ...
- BP神经网络—java实现(转载)
神经网络的结构 神经网络的网络结构由输入层,隐含层,输出层组成.隐含层的个数+输出层的个数=神经网络的层数,也就是说神经网络的层数不包括输入层.下面是一个三层的神经网络,包含了两层隐含层,一个输出层. ...
- export default 和 export的使用方式
注意:1.export default 向外暴露的成员,可以使用任意的变量来接收 2.在一个模块中 ; export default 只允许向外暴露一次 3.在一个模块中 ; 可以同时使用 expor ...
- Sql Server 查看存储过程最后修改时间
Sql Server 查看存储过程最后修改时间 select * from sys.procedures order by modify_date desc
- PHP如何实现99乘法表?
看到这个问题,可能大家更多的是考虑到用for循环,个人觉得使用for循环太影响程序性能.推荐使用递归处理. /** * Title : 递归实现99乘法表 * Author : Bruceqi * ...
- 【转载】vue.js实现格式化时间并每秒更新显示功能示例
引用:https://www.jb51.net/article/143351.htm 这篇文章主要介绍了vue.js实现格式化时间并每秒更新显示功能,结合实例形式分析了vue.js时间格式化显示与基于 ...
- mybatis报错:sql中有条件语句时出现属性没有getter的异常
Mybatis问题:在使用条件语句动态设置SQL语句时出现如下错误 Caused by: org.apache.ibatis.reflection.ReflectionException: There ...
- Leecode刷题之旅-C语言/python-88合并两个有序数组
/* * @lc app=leetcode.cn id=88 lang=c * * [88] 合并两个有序数组 * * https://leetcode-cn.com/problems/merge-s ...
- error:control reaches end of non-void function [-Werror=return-type]
在做LeetCode上的题目时,出现了这个错误, 原代码如下: class Solution { public: vector<int> twoSum(vector<int>& ...