飞道的博客

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

436人阅读  评论(0)

一、算法类型

有监督的回归算法

二、评估指标

残差平⽅和:

平均残差:

预测数据与标签均值之间差值的平⽅和:

实际值和均值之间的差值的平⽅和:

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)实战(调用函数)

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)实战(调用函数)

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)实战(调用函数)

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调包实现

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 #多重共线性判断

转载:https://blog.csdn.net/cqx2020/article/details/106555420
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场