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:UsersAdministratorPycharmProjectspythonProject 616linear.m'
model.save(path)
model.load(path)
print(model.predict(X))