python实现一元和多元线性回归

定义

确定两种或两种以上变量间相互依赖的定量关系的一种统计分析方法,分为单变量线性回归和多变量线性回归,即一元和多元。

一元线性回归

1.一元线性回归公式

(1) y = θ 0 + θ 1 x + ε y = \theta_{0}+\theta_{1}x + \varepsilon \tag{1} y=θ0+θ1x+ε(1)
其中y为因变量,x为自变量, θ 1 \theta_{1} θ1为斜率, θ 0 \theta_{0} θ0为截距, ε \varepsilon ε为误差。线性回归的目标是为了找到一个函数 y ^ = θ 0 + θ 1 x \hat{y} = \theta_{0}+\theta_{1}x y^=θ0+θ1x使得 ε \varepsilon ε ε = y − y ^ \varepsilon = y - \hat{y} ε=yy^)最小

2.损失函数

将方差作为损失函数,目标是使得方差最小。
(2) J ( θ 0 , θ 1 ) = 1 2 m ∑ i = 0 n ( y i − y ^ i ) 2 J(\theta_{0},\theta_{1}) = \frac{1}{2m}\sum_{i=0}^{n}{(y_{i} - \hat{y}_{i})^{2}} \tag{2} J(θ0,θ1)=2m1i=0n(yiy^i)2(2)

3.优化准则,梯度下降

(3) θ 0 = θ 0 − α ∂ θ 0 J ( θ 0 , θ 1 ) \theta_{0} = \theta_{0} - \alpha\frac{\partial }{\theta_{0}}J(\theta_{0},\theta_{1}) \tag{3} θ0=θ0αθ0J(θ0,θ1)(3)
(4) θ 1 = θ 1 − α ∂ θ 1 J ( θ 0 , θ 1 ) \theta_{1} = \theta_{1} - \alpha\frac{\partial }{\theta_{1}}J(\theta_{0},\theta_{1}) \tag{4} θ1=θ1αθ1J(θ0,θ1)(4)
偏导数代表对于 θ j \theta_{j} θj的梯度方向, α \alpha α为步长,中间为减号的原因是因为函数值沿着梯度的方向是函数增加最快的方向,而针对损失函数J来说要求得最小值,所以沿着梯度相反的方向就行了。详细

多元线性回归

一元线性回归是多元线性回归的特例,在做线性回归时应该首先判断哪些特征与结果是相关的,判断方法可以采用协方差或者皮尔逊相关系数。

1.多元线性回归公式

(1) y = θ T X + ε y = \theta^{T}X + \varepsilon \tag{1} y=θTX+ε(1)
其中y为因变量, X = { x 0 , x 1 , . . . , x n } X={\{x_{0},x_{1},...,x_{n}\}} X={x0,x1,...,xn}为特征向量, θ = { θ 0 , θ 1 , . . . , θ n } \theta={\{\theta_{0},\theta_{1},...,\theta_{n}\}} θ={θ0,θ1,...,θn}为每个特征的权重, θ 0 \theta_{0} θ0为截距,默认 x 0 x_{0} x0为1, ε \varepsilon ε为误差。线性回归的目标是为了找到一个函数 y ^ = θ T X \hat{y} = \theta^{T}X y^=θTX使得 ε \varepsilon ε ε = y − y ^ \varepsilon = y - \hat{y} ε=yy^)最小

2.损失函数

将方差作为损失函数,目标是使得方差最小。
(2) J ( θ ) = 1 2 m ∑ i = 0 n ( y i − y ^ i ) 2 J(\theta) = \frac{1}{2m}\sum_{i=0}^{n}{(y_{i} - \hat{y}_{i})^{2}} \tag{2} J(θ)=2m1i=0n(yiy^i)2(2)

3.优化准则,梯度下降

(3) θ j = θ j − α ∂ θ j J ( θ ) \theta_{j} = \theta_{j} - \alpha\frac{\partial }{\theta_{j}}J(\theta) \tag{3} θj=θjαθjJ(θ)(3)

正规方程解

在这里插入图片描述

代码

#单元线性回归
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
d = pd.read_csv('Salary_Data.csv')
d.head()
#看一下数据的分布情况
%matplotlib inline
df.plot.scatter(x='x1', y='y')

#处理数据,将其变成特征矩阵X和结果矩阵Y
df = pd.DataFrame(data=d,columns=['YearsExperience','Salary'])
df.insert(0,'x0',[1] * df.shape[0])
df = df.rename(columns={'YearsExperience':'x1','Salary':'y'})
x = df[['x0','x1']].values
y = df[['y']].values

#画线性方程和数据的散点图
def plotLiner(x, y, theta):
#     x = np.array(df[0][1],df[-1][1]) 
#     y = theta[0] + theta[1] * x 
    px = np.linspace(x[0][1], x[-1][1], 10000) 
    py = theta[0]+theta[1]*px#方程式
    plt.figure(num=1)
    #获取图片并命名
    plt.plot(px,py,color='blue',linewidth=1.0,label='blue')
    plt.plot(x[:,1],y,'bo')
    plt.show()

#梯度下降算法,学习率太大不能收敛,太小难以收敛
def gradientDescent(x,y):
    n = x.shape[1]
    theta = np.ones((n,1))
    numIter = 100000
    alpha = 0.0016
    for i in range(numIter):
        yHat = np.dot(x,theta)
        j = (yHat - y)
        theta = theta - alpha * np.dot(x.transpose(), j)
        #每1000次迭代查看一下拟合情况
        if i % 1000 == 0:
            plotLiner(x,y,theta)
            print('%d : %f'%(i,theta.sum()))
    return theta
theta = gradientDescent(x,y)       
        

工资数据
0次迭代
1000次迭代
3000次迭代

#多元线性回归,结果是Spend2相关性不高,其实可以不考虑Spend2
mdf = pd.read_csv('COM.csv')
mdf.corr()

stateList = list(mdf['State'].unique())
mdf.insert(0,'x0',[1] * mdf.shape[0])
mdf['State'] = mdf['State'].apply(lambda x : stateList.index(x)+1)
spend1Max = mdf['Spend1'].max()
mdf['Spend1'] = mdf['Spend1'] / spend1Max
spend3Max = mdf['Spend3'].max()
mdf['Spend3'] = mdf['Spend3'] / spend3Max
mdf.head()

X = mdf.iloc[:,[0,1,3]].values
Y = mdf[['Profit']].values

def gradientDescent1(x,y):
    n = x.shape[1]
    theta = np.ones((n,1))
    numIter = 10000
    alpha = 0.001
    for i in range(numIter):
        yHat = np.dot(x,theta)
        j = (yHat - y)
        theta = theta - alpha * np.dot(x.transpose(), j)
    return theta
theta = gradientDescent1(X,Y)

from numpy.linalg import inv
#用正规方程来解
def normalEquation(X,Y):
    theta = np.dot(np.dot(inv(np.dot(X.T,X)), X.T),Y)
    return theta
a = normalEquation(X,Y)

在这里插入图片描述
梯度下降解出来的
正规方程解出来的

  • 8
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
【优质项目推荐】 1、品质保证:项目代码均经过严格测试,确保功能稳定且运行ok。您可以放心下载并立即投入使用,若遇到任何问题,随时欢迎您的反馈与交流。 2、适用广泛:无论您是计算机相关专业(如计算机科学、信息安全、数据科学、人工智能、通信、物联网、自动化、电子信息等)的在校学生、专业老师,还是企业员工,都适用。 3、多用途价值:该项目不仅具有很高的学习借鉴价值,对于初学者来说,是入门进阶的绝佳选择;当然也可以直接用于 毕业设计、课程设计、期末大作业或项目初期立项演示等。 3、开放创新:如果您有一定基础,且热爱探索钻研,那该项目代码更是您发挥创意、实现新功能的起点。可以基于此代码进行修改、扩展,创造出属于自己的独特应用。 欢迎下载使用优质资源!欢迎交流学习,欢迎借鉴引用,共同探索编程的无穷魅力! 基于Python实现一元单变量回归和多元线性回归对波士顿房价预测源码+数据集+详细注释.zip基于Python实现一元单变量回归和多元线性回归对波士顿房价预测源码+数据集+详细注释.zip基于Python实现一元单变量回归和多元线性回归对波士顿房价预测源码+数据集+详细注释.zip基于Python实现一元单变量回归和多元线性回归对波士顿房价预测源码+数据集+详细注释.zip基于Python实现一元单变量回归和多元线性回归对波士顿房价预测源码+数据集+详细注释.zip基于Python实现一元单变量回归和多元线性回归对波士顿房价预测源码+数据集+详细注释.zip

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值