Python算法总结(五)线性回归(附手写python实现代码)

一、算法类型

有监督的回归算法

二、评估指标

残差平⽅和:
Python算法总结(五)线性回归(附手写python实现代码)_第1张图片
平均残差:
在这里插入图片描述
预测数据与标签均值之间差值的平⽅和:
在这里插入图片描述
实际值和均值之间的差值的平⽅和:
在这里插入图片描述
R方:
在这里插入图片描述

三、手写Python线性回归算法

1.简单线性回归
(1)损失函数公式
在这里插入图片描述
(2)参数w求解公式
在这里插入图片描述
(3)手写python算法

# 计算回归系数
def Standard_Regress(dataset):
    xmat=np.mat(dataset.iloc[:,:-1].values)
    ymat=np.mat(dataset.iloc[:,-1].values).T
    xtx=xmat.T*xmat
    if np.linalg.det(xtx)==0:
        print('矩阵为奇异矩阵,无法求逆')
        return
    ws=xtx.I*(xmat.T*ymat)  #关键的一步,ws的求解公式
    return ws

(4)实战(调用函数)
Python算法总结(五)线性回归(附手写python实现代码)_第2张图片
2.局部加权线性回归
(1)损失函数公式

(2)参数w求解公式
在这里插入图片描述
在这里插入图片描述
说明:点越近,权重越大;k越小,大部分样本点的权重都接近0。
注意:wHat与W是不同的,wHat是斜率(截距),W是样本权重。
(3)手写python算法

def LWLR(dataset,newxdata,k=1.0):
    '''
    函数功能:计算局部加权线性回归的预测值
    参数说明:
        dataset:训练集,带标签,df格式
        newxdata: 新样本,不带标签,df格式
    返回:
        y_re:新样本的标签预测值
    '''
    xmat=np.mat(dataset.iloc[:,:-1].values)
    ymat=np.mat(dataset.iloc[:,-1].values).T
    newxdata=np.mat(newxdata.values)
    
    n=xmat.shape[0]           # n个样本
    weights=np.mat(np.eye(n)) #样本权重,不是斜率
    
    m=newxdata.shape[0]          # m个新样本
    y_pre=np.zeros(m)         
    
    for i in range(m):
        for j in range(n):
            diff=xmat[j]-newxdata[i]
            weights[j,j]=np.exp( (diff*diff.T) / ((-2)*(k**2)))
        xtx=xmat.T * (weights * xmat)         #关键的一步,对样本增加权重
        if np.linalg.det(xtx)==0:
            print('矩阵为奇异矩阵,无法求逆')
            return
        ws=xtx.I*(xmat.T*(weights*ymat))  #关键的一步,ws在各局部范围是不一样的
        y_pre[i]=newxdata[i]*ws
    return y_pre

(4)实战(调用函数)
Python算法总结(五)线性回归(附手写python实现代码)_第3张图片
3.Ridge线性回归
(1)损失函数公式
在这里插入图片描述
(2)参数w求解公式
在这里插入图片描述
说明:当惩罚力度越⼤,模型越不容易受到共线性的影响。
(3)手写python算法

#注:本质上还是构建一条线或一个超平面。所以要求解回归系数。
def Ridge_Regress(dataset,lam=0.2):
    xmat=np.mat(dataset.iloc[:,:-1].values)
    ymat=np.mat(dataset.iloc[:,-1].values).T
    xtx=xmat.T*xmat
    denom=xtx+lam*np.eye(xmat.shape[1])
    ws=denom.I*(xmat.T*ymat)  #关键的一步,ws的求解公式
    return ws

(4)实战(调用函数)
Python算法总结(五)线性回归(附手写python实现代码)_第4张图片
4.Lasso线性回归
(1)损失函数公式
在这里插入图片描述
(2)参数w求解公式
在这里插入图片描述
(3)手写python算法

#注:本质上还是构建一条线或一个超平面。所以要求解回归系数。
def Lasso_Regress(dataset,lam=0.2):
    xmat=np.mat(dataset.iloc[:,:-1].values)
    ymat=np.mat(dataset.iloc[:,-1].values).T
    xtx=xmat.T*xmat
    i=np.eye(xmat.shape[1])
    ws=(xtx.I)*((xmat.T*ymat)-((lam*i)/2))  #关键的一步,ws的求解公式
    return ws

(4)实战(调用函数)
Python算法总结(五)线性回归(附手写python实现代码)_第5张图片

四、Python调包实现

import statsmodels.api as sm #线性回归与更多解释
from sklearn.linear_model import LinearRegression
from sklearn.linear_model import Ridge
from sklearn.linear_model import Lasso
from sklearn.metrics import mean_squared_error,r2_score #评估指标
from statsmodels.stats.outliers_influence import variance_inflation_factor #多重共线性判断

参考:http://edu.cda.cn/course/966

你可能感兴趣的:(Python)