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))
线性回归伪代码
最新推荐文章于 2022-11-08 22:38:27 发布