import numpy as np
class LinearRegression:
def __init__(self):
"""初始化模型"""
self.coef_=None
self.inter_=None
self.__theta=None
def fit(self,X_train,y_train):
"""根据训练数据集X_train, y_train训练Linear Regression模型"""
assert X_train.shape[0] == y_train.shape[0], \
"the size of X_train must be equal to the size of y_train"
X_b=np.hstack([np.ones((len(X_train),1)),X_train])
self.__theta=np.linalg.inv(X_b.T.dot(X_b)).dot(X_b.T).dot(y_train)
self.inter_=self.__theta[0]
self.coef_=self.__theta[1:]
return self
def predict(self,X_predict):
"""给定待预测数据集X_predict,返回表示X_predict的结果向量"""
assert self.inter_ is not None and self.coef_ is not None, \
"must fit before predict!"
assert X_predict.shape[1] == len(self.coef_), \
"the feature number of X_predict must be equal to X_train"
X_b=np.hstack([np.ones((len(X_predict),1)),X_predict])
return X_b.dot(self.__theta)
def score(self,X_test,y_test):
y_predict=self.predict(X_test)
return self.r2_score(y_test,y_predict)
def mean_squared_error(self,y_true, y_predict):
"""计算y_true和y_predict之间的MSE"""
assert len(y_true) == len(y_predict), \
"the size of y_true must be equal to the size of y_predict"
return np.sum((y_true - y_predict) ** 2) / len(y_true)
def r2_score(self,y_true, y_predict):
"""计算y_true和y_predict之间的R Square"""
return 1 - self.mean_squared_error(y_true, y_predict) / np.var(y_true)
def __repr__(self):
return "LinearRegression()"
运行结果