非线性回归例题(2非线性回归)
非线性回归例题(2非线性回归)2.1什么情况下用线性回归二、非线性回归前言一、课前回顾应变量只有一个,一元线性回归,拟合一条直线;应变量有多个,但是还是一次的,多元线性回归,拟合一个曲面,线性回归平面,如果三维以上就是超平面;
1.课前回顾
2.前言
3.非线性回归
一、课前回顾
应变量只有一个,一元线性回归,拟合一条直线;
应变量有多个,但是还是一次的,多元线性回归,拟合一个曲面,线性回归平面,如果三维以上就是超平面;
二、非线性回归前言
2.1什么情况下用线性回归
除了一元、多元就是非线性回归,用来拟合的曲线可能是二次多项式的抛物线、指数曲线,逻辑斯特曲线
要判断用线性回归是否合适,最简单的可以先观测它的相关系数,如果相关系数很接近1,就可以大胆使用线性回归,如果相关系数不高,用线性回归就不合适。
上图中左图相关系数为0.99,右图是0.957
2.2什么情况下用非线性回归
如上图是一条s形曲线,所以用线性回归做拟合效果不好,可以用非线性回归,首先预定一个方程,可能是多项式、正切、指数、对数,需要去确定里面的系数,非线性在数学上不好解,非线性可以用梯度下降法 牛顿法等数学手段。
三、非线性回归
现实世界中严格的线性模型并不多见,它们或多或少都带有某种程度的近似;在不少情况下,非线性模型可能更加符合实际。
对变量间非线性相关问题的曲线拟合,处理的方法主要有:
1.首先决定非线性模型的函数类型,对于其中可线性化问题则通过变量变换将其线性化,从而归结为前面的多元线性回归问题来解决。
2.若实际问题的曲线类型不易确定时,由于任意曲线皆可由多项式来逼近,故常可用多项式回归来拟合曲线。
3.若变量间非线性关系式已知(多数未知),且难以用变量变换法将其线性化,则进行数值迭代的非线性回归分析。
3.1可变换成线性的非线性回归
在很多场合,可以对非线性模型进行线性化处理,尤其是可变换为线性的非线性回归,运用最小二乘法进行推断,对线性化后的线性模型,可以应用之前学过的东西进行解答
3.2多项式回归分析
由数学分析知识可知,一般函数都可用多项式来逼近,故多项式回归分析可用来处理相当广泛的非线性问题。
理论上是可以理解任意的散点,不论散点多么不规则,只要选择次数足够高的多项式,是一定能够拟合的,甚至可以让线通过每一个散点,但是这样拟合出来的线会出现过度拟合的(用学习集构建非常好,用预测集就不行了)
对观测数据(xt,yt)(t= 1,…,N),多项式回归模型为:
由此即可求得其多项式回归方程。
3.3逻辑回归
3.3.1课前知识
(1)概率
(1.1) 定义 概率(P)robability: 对一件事情发生的可能性的衡量
(1.2) 范围 0 <= P <= 1
(1.3) 计算方法:
(1.3.1) 根据个人置信:
个人的主观理解,认为明天60%下雨
(1.3.2) 根据历史数据:
根据历史明天的天气下雨还是晴天
(1.3.3) 根据模拟数据:
工厂制作手机,生产次品的概率是多少 ,假设生产1000手机,其中3部次品,再生产一台手机出现次品的概率是3/1000
(2)条件概率
有两个事件A、B,在B已经发生的情况下,A发生的概率,就叫A对于B发生的条件概率
A和B同时发生的概率除以B单独发生的概率
举例:抽出10000场比赛中,一个球员上场,受伤的概率是多少而
如果已经比赛是职业联赛,一个球员上场,受伤的概率是多少
两个不一样
(3)LogisticRegression (逻辑回归)基本模型
测试数据为X(x0,x1,x2···xn)
要学习的参数为: Θ(θ0,θ1,θ2,···θn)
目的是求参数,线性加权求和的方式求
可以用向量表示
(行乘以列)
引入Sigmoid函数时曲线平滑化(需要引入Sigmoid使y值在0 1之间,让其平滑化
)
值域在0 1之间
定义域在负无穷到正无穷
当Z=0 g(Z)=0.5
当Z>0 g(Z)>0.5
当Z<0 g(Z)<0.5
预测函数-逻辑回归,第一部分是加权求和,第二部分是Sigmoid函数:
可以用概率的形式描述,用概率表示:
正例(y=1):
给定的自变量x 参数为 Θ的情况下,应变量y=1的概率
反例(y=0):
(3.1)构造目标函数
线性回归:
Y表示真实值
X表示自变量
H(x)表示预测值
也就是
找到合适的 θ0,θ1使上式最小
Logistic regression:
目标函数:
目标:找到合适的 θ0,θ1使上式最小
转化为对数-对数的性质可以把乘除转化为加减法
对数是单调的,对数最大化最小化就是对里面的函数最大最小化,还可以减少运算量
需要训练出一组数据使得Cost函数最小化
求偏导,让导数=0,求出θ
方程是非线性的,所以用梯度下降法来求解
(3.2)解法:梯度下降(gradient decent)
对于多元非线性函数,有一个曲面,从一个点出发,找到一个最低点,各个方向都可以走,要走最陡的梯度下降最大,对应求导数,找到斜率最大的,重复一直走,可以找到最低点
想到与等高线,坡度最陡的走,可以找到最低点
阿尔法叫学习率,每一步步子的大小,是设定好的
更新法则:
学习率
同时对所有的θ进行更新
重复更新直到收敛
回归其他知识:选定变量(多元),避免多重共线性,观察拟合方程,避免过度拟合,检验模型是否合理
python代码实现
#numpy以矩阵为基础进行科学计算
import numpy as np
#随机产生一些数
import random
# m denotes the number of examples here not the number of features
#实现了通过梯度下降法更新参数斯塔
#theta参数值,alpha学习率,m实例个数,numIterations重复更新次数
def gradientDescent(x y theta alpha m numIterations):
#transpose x的转置
xTrans = x.transpose()
for i in range(0 numIterations):
hypothesis = np.dot(x theta)
#估计值减实际值
loss = hypothesis - y
# avg cost per example (the 2 in 2*m doesn't really matter here.
# But to be consistent with the gradient I include it)
#loss的平方
cost = np.sum(loss ** 2) / (2 * m)
print("Iteration %d | Cost: %f" % (i cost))
# avg gradient per example
#需要更新的部分
gradient = np.dot(xTrans loss) / m
# update
theta = theta - alpha * gradient
return theta
#定义一个函数,创建一组数据,作为测试用
#zeros所有元素都为0,shape行列,numPoints多少个实例,bias偏好值,对数据进行加减,variance方差
#numPoints传入的行数,2传入的列
def genData(numPoints bias variance):
x = np.zeros(shape=(numPoints 2))
y = np.zeros(shape=numPoints)
#从0到numPoints,左闭右开
# basically a straight line
for i in range(0 numPoints):
# bias feature
x[i][0] = 1
x[i][1] = i
# our target variable
#i第几行就是几,uniform从0到1之间随机产生一些数据,乘以方差
#0-99加上25,加0 1之间的数据乘以10
y[i] = (i bias) random.uniform(0 1) * variance
return x y
# gen 100 points with a bias of 25 and 10 variance as a bit of noise
x y = genData(100 25 10)
m n = np.shape(x)
n_y = np.shape(y)
print "x:"
print x
print "y:"
print y
print str(m)
print n
print n_y
#更新100000次
numIterations= 100000
#每一步迈的小点,最好开始大后面小,太大可能跨过去。太小效率低
alpha = 0.0005
#theta初始值,m个实例,n维,2维,1和1
theta = np.ones(n)
#m实例的个数
theta = gradientDescent(x y theta alpha m numIterations)
print(theta)