快捷搜索:  汽车  科技

非线性回归例题(2非线性回归)

非线性回归例题(2非线性回归)2.1什么情况下用线性回归二、非线性回归前言一、课前回顾应变量只有一个,一元线性回归,拟合一条直线;应变量有多个,但是还是一次的,多元线性回归,拟合一个曲面,线性回归平面,如果三维以上就是超平面;

1.课前回顾

2.前言

3.非线性回归

一、课前回顾

应变量只有一个,一元线性回归,拟合一条直线;

非线性回归例题(2非线性回归)(1)

应变量有多个,但是还是一次的,多元线性回归,拟合一个曲面,线性回归平面,如果三维以上就是超平面;

非线性回归例题(2非线性回归)(2)

二、非线性回归前言

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)构造目标函数

线性回归:

非线性回归例题(2非线性回归)(3)

Y表示真实值

X表示自变量

H(x)表示预测值

也就是

非线性回归例题(2非线性回归)(4)

找到合适的 θ0,θ1使上式最小

Logistic regression:

目标函数:

非线性回归例题(2非线性回归)(5)

目标:找到合适的 θ0,θ1使上式最小

转化为对数-对数的性质可以把乘除转化为加减法

对数是单调的,对数最大化最小化就是对里面的函数最大最小化,还可以减少运算量

需要训练出一组数据使得Cost函数最小化

求偏导,让导数=0,求出θ

方程是非线性的,所以用梯度下降法来求解

(3.2)解法:梯度下降(gradient decent)

非线性回归例题(2非线性回归)(6)

对于多元非线性函数,有一个曲面,从一个点出发,找到一个最低点,各个方向都可以走,要走最陡的梯度下降最大,对应求导数,找到斜率最大的,重复一直走,可以找到最低点

非线性回归例题(2非线性回归)(7)

想到与等高线,坡度最陡的走,可以找到最低点

非线性回归例题(2非线性回归)(8)

阿尔法叫学习率,每一步步子的大小,是设定好的

更新法则:

非线性回归例题(2非线性回归)(9)

学习率

同时对所有的θ进行更新

重复更新直到收敛

回归其他知识:选定变量(多元),避免多重共线性,观察拟合方程,避免过度拟合,检验模型是否合理

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)

猜您喜欢: