多元线性回归算法的封装
- 首先构造该类的示例
- 调用fit方法训练模型
- 使用predict进行预测
- 使用score查看模型得分
# -*- coding:utf-8
"""
作者: Jia
日期: 2022年01月30日
描述: 多元线性回归的算法封装
"""
import numpy as np
from numpy import linalg
class multiLinerRegression:
def __init__(self):
"""
初始化权重和截距
"""
self.coef = None # 代表的是权重
self.interception = None # 代表的是截距
self._theta = None # 代表的是权重加截距形成的矩阵
def fit(self, train_data, train_label):
"""
训练模型生成权重和截距
:param train_data: 训练数据集
:param train_label: 训练数据标签
:return:
"""
assert train_data.shape[0] == train_label.shape[0], "训练集的矩阵行数应于标签行数一致"
ones = np.ones((train_data.shape[0], 1))
x_b = np.hstack((ones, train_data)) # 将训练矩阵转换为X_b矩阵,其中第一列为1,其余不变
# 根据正规方程公式求得权重矩阵,公式:\theta = (X^T * X)^{-1} * X^T * y
self._theta = linalg.inv(x_b.T.dot(x_b)).dot(x_b.T).dot(train_label)
self.interception = self._theta[0]
self.coef = self._theta[1:]
return self
def predict(self, x_predict):
"""
根据拟合后的模型进行预测
:param x_predict: 带预测数据集
:return: 预测结果
"""
ones = np.ones((x_predict.shape[0], 1))
x_b = np.hstack((ones, x_predict))
return x_b.dot(self._theta)
def mean_squard_error(self, y_true, y_predict):
return np.sum((y_true - y_predict) ** 2) / len(y_true)
def score(self, test_data, test_label):
"""
模型得分
:param test_data: 测试数据
:param test_label: 测试数据标签
:return:
"""
y_predict = self.predict(test_data)
return 1 - (self.mean_squard_error(test_label, y_predict) / np.var(test_label))