线性回归伪代码

import numpy as np
from sklearn.model_selection import train_test_split
import joblib


class Linear:
    def __init__(self,fit_intercept=True):
        self.theta=None
        self.bias=0
        self.fit_intercept=fit_intercept
    def fit(self,X,Y,lamda=0.001):
        X = np.mat(X)
        Y = np.mat(Y)
        if self.fit_intercept:
            X = np.column_stack((np.ones_like(X[:,0]), X))
            try:
                theta = (X.T * X + lamda * np.eye(X.shape[1])).I * X.T * Y   #lamda防止矩阵不可逆
                self.theta = theta[1:]
                self.bias = theta[0]
            except Exception:
                print('矩阵不可逆,请重新设置lamda的值!')

        else:
            try:
                theta = (X.T*X+lamda*np.eye(X.shape[1])).I * X.T * Y
                self.theta=theta
            except Exception:
                print('矩阵不可逆,请重新设置lamda的值!')

    def predict(self,X):
        y_hat=X*self.theta+self.bias
        return y_hat

    def r2_score(self,X,Y):
        X = np.mat(X)
        Y = np.mat(Y)
        res=np.sum(np.square(Y-self.predict(X)))
        var=np.sum(np.square(Y-np.mean(Y)))
        R2=1-res/var
        return R2

    def mes_score(self,X,Y):
        X = np.mat(X)
        Y = np.mat(Y)
        mse=np.mean(np.sum(np.square(Y-self.predict(X))))
        return mse

    def save(self,path):
        model=(self.theta,self.bias)
        joblib.dump(model,path)


    def load(self,model_path):
        self.theta,self.bias=joblib.load(model_path)



if __name__ == '__main__':
    array = np.array([[1,2,3,10.56],
                       [2,3,4, 27],
                       [3,4,5, 39.1],
                       [4,5,6, 40.4],
                       [5,6,7, 58],
                       [6,7,8, 60.5],
                       [7,8,9, 79],
                       [8,9,10, 87],
                       [9,10,12, 90],
                       [10,11,13, 95]],
                      )
    X=array[:,:-1].reshape(-1,array.shape[1]-1)
    Y=array[:,-1].reshape(-1,1)
    x_train,x_test,y_train,y_test=train_test_split(X,Y,train_size=0.8,random_state=4)
    model=Linear(fit_intercept=True)
    model.fit(x_train,y_train,lamda=0.001)
    print('训练集上的R2:',model.r2_score(x_train,y_train))
    print('测试集上的R2:',model.r2_score(x_test, y_test))
    print('训练集上的MES:', model.mes_score(x_train, y_train))
    print('测试集上的MES:', model.mes_score(x_test, y_test))
    path=r'C:\Users\Administrator\PycharmProjects\pythonProject\0616\linear.m'
    model.save(path)
    model.load(path)
    print(model.predict(X))
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值