'''
基于极大似然原理的没有截距的线性回归 y=wx
属性:系数 w
功能: fit 基于X,y 求w
pridict 加入X 预测相应y
'''
class LinearRegressionself():
def __init__(self):
self.w = None
def fit(self,X,y):
b = np.ones(X.shape[0])
X = np.insert(X,0,values = b,axis=1)
#self.w = np.linalg.inv(X.T.dot(X)).dot(X.T).dot(y)
X_ = np.linalg.inv(X.T.dot(X))
self.w = X_.dot(X.T).dot(y)
def predict(self,X):
b = np.ones(X.shape[0])
X = np.insert(X,0,values = b,axis=1)
y_pred = X.dot(self.w)
return y_pred
def score(self,y,y_pred):
accuracy = np.mean(np.power(y - y_pred,2))
return accuracy
与python自带线性回归模型精度比较,结果一致
if __name__ == '__main__':
from sklearn import datasets
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
dataset = datasets.load_diabetes()
X = dataset.data
y = dataset.target
X_train,X_test,y_train,y_test = train_test_split(X,y,test_size = 0.2)
lr_self = LinearRegressionself()
lr_self.fit(X_train,y_train)
y_ = lr_self.predict(X_test)
accuracy_self = lr_self.score(y_test,y_)
# print(accuracy_self)
#--------------------------#
lr = LinearRegression()
lr.fit(X_train,y_train)
y_ = lr.predict(X_test)
accuracy = np.mean(np.power(y_test- y_,2))
# print(accuracy)
if np.abs(accuracy_self - accuracy)<1e-4:
print('算法与python给的原算法结果一致')
else:
print('算法与python给的原算法结果不一致')