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 这里就不过 ...
随机推荐
- C#中的代码书写规范以及命名规范
C#代码书写规则: 1. 尽量使用接口,然后使用类实现接口,以提高程序的灵活性. 2.一行不要超过80个字符 3.尽量不要手动更改计算机生成的代码 4.关键的语句写注释 5.建议局部变量在最接近使用它 ...
- 【oracle使用笔记3】sql查询遇到的若干问题总结
在整个开发过程中,sql查询操作的频率比较高,在不同的业务场景下会出现不同的查询需求,以下是我在项目中遇到的查询需求,总结一下. [查询一]:取查询出的第一条数据 select * from (sel ...
- 在C++中如何实现文件的读写
一.ASCII 输出为了使用下面的方法, 你必须包含头文件<fstream.h>(译者注:在标准C++中,已经使用<fstream>取代< fstream.h>,所 ...
- VMware ESXi-6.7——使用
1: 上传ISO文件 1.1:创建一个新目录,上传ISO 1.2: 在新建虚拟机时,点击DVD,选择数据ISO文件,选择要安装的ISO文件.并把连接打钩. 2:新建虚拟机 按照需求填写 硬盘的三种置备 ...
- Spring Boot2.4双数据源的配置
相较于单数据源,双数据源配置有时候在数据分库的时候可能更加有利 但是在参考诸多博客以及书籍(汪云飞的实战书)的时候,发现对于spring boot1.X是完全没问题的,一旦切换到spring boot ...
- @staticmethod怎么用?
早上起来写个小demo, 类中写了个方法, pycharm给这个方法加上了莫名其妙的波浪线, 对于一个有代码洁癖的人来说, 完全不能忍, 来看看为什么. 问题重现 pycharm的提示 上面说了, 这 ...
- 源码安装CentOs7下的PHP7
首先安装APACHE环境,直接用yum安装 yum install httpd httpd-devel /etc/httpd/ systemctl start httpd.service #启动apa ...
- JZOJ 5943. 树
Description
- Python基本数据类型(二)
数字类型: 数字的定义: 1.数字不可变,不可迭代 在python3里面所有的整形都是 int 在python2里面数字叫整型,整数类型,有int 有long 数字的方法: 数字的方法: 1.--- ...
- C语言实现计算二进制数字1的个数
#include<stdio.h> #include<stdlib.h> int print_one_bits01(unsigned int value){ //0000 11 ...