python版一元线性回归的算法封装(附详细注释)
使用说明:
- 先使用fit训练模型
- 然后再使用predict函数进行预测
- 最后提供了两种误差评估
# -*- coding:utf-8
"""
作者: Jia
日期: 2022年01月30日
描述: 一元线性回归的算法封装
"""
import numpy as np
class uniLinearResgression:
def __init__(self):
"""初始化一元线性回归模型"""
self.a = None # a是斜率
self.b = None # b是截距
def fit(self, x_train, y_train):
"""
训练模型
:param x_train: 训练数据集
:param y_train: 训练数据标签
:return:
"""
assert x_train.ndim == 1, "一元线性回归模型仅能处理向量,不能处理矩阵"
x_mean = np.mean(x_train)
y_mean = np.mean(y_train)
denominator = 0.0 # 分母
numerator = 0.0 # 分子
for (x, y) in zip(x_train, y_train):
numerator += (x - x_mean) * (y - y_mean)
denominator += (x - x_mean) ** 2
self.a = numerator / denominator
self.b = y_mean - self.a * x_mean
return self
def predict(self, x_test_group):
"""
预测函数
:param x_test_group: 待预测的数据集
:return: 预测值
"""
return np.array([self._predict(x_test) for x_test in x_test_group])
def _predict(self, x_test):
"""
计算每一个预测值
:param x_test: 待预测的数据
:return: 预测结果
"""
return self.a * x_test + self.b
def mean_squard_error(self, y_true, y_predict):
return np.sum((y_true - y_predict) ** 2) / len(y_true)
def r_square(self, y_true, y_predict):
"""
误差衡量标准,R squared
返回值肯定是小于等于1的,R squared的值越大越好,当我们的预测模型完全预测准确时,就会得到最大值1
:param y_true: 实际值
:param y_predict: 预测值
:return: R squared
"""
return 1 - (self.mean_squard_error(y_true, y_predict)) / np.var(y_true)
if __name__ == '__main__':
x = np.array([1, 2, 4, 6, 8])
y = np.array([2, 5, 7, 8, 9])
lr = uniLinearResgression() # 训练模型的类名
lr.fit(x, y) # 训练模型得到a,b
print(lr.predict([7]))
print(lr.r_square([8, 9], lr.predict([6, 8])))