# 线性回归算法学习总结（一）

## 作用

导数为0取得极值：

## 简单线性回归的实现

### 封装通用方法

import numpy as np

class SimpleLinearRegression1:

def __init__(self):
self.a_ = None
self.b_ = None

def fit(self, x_train, y_train):
"""根据训练数据集x_train,y_train训练Simple Linear Regression模型"""
x_mean = np.mean(x_train)
y_mean = np.mean(y_train)

num = 0.0
d = 0.0
#zip() 将可迭代的对象中对应的元素打包成一个个元组，然后返回由这些元组组成的列表。
for x, y in zip(x_train, y_train):
num += (x - x_mean) * (y - y_mean)
d += (x - x_mean) ** 2

self.a_ = num / d
self.b_ = y_mean - self.a_ * x_mean

return self

def predict(self, x_predict):
"""给定待预测数据集x_predict，返回表示x_predict的结果向量"""
assert x_predict.ndim == 1, \
"Simple Linear Regressor can only solve single feature training data."
assert self.a_ is not None and self.b_ is not None, \
"must fit before predict!"

return np.array([self._predict(x) for x in x_predict])

def _predict(self, x_single):
"""给定单个待预测数据x，返回x的预测结果值"""
return self.a_ * x_single + self.b_

def __repr__(self):
return "SimpleLinearRegression1()"


### 使用

import numpy as np
import matplotlib.pyplot as plt
from playML.SimpleLinearRegression import SimpleLinearRegression1

x = np.array([1., 2., 3., 4., 5.])
y = np.array([1., 3., 2., 3., 5.])
reg1 = SimpleLinearRegression1()
reg1.fit(x, y)
reg1.predict(np.array([x_predict]))

## 最小二乘法(多元线性回归)

y=\theta_{0}+\theta_{1} x_{1}+\theta_{2} x_{2}+\ldots+\theta_{n} x_{n}

### 最小二乘法的局限性

1. 如果拟合函数不是线性的，这时无法使用最小二乘法。
2. 特征 n 非常的大的时候不可行，建议超过10000个特征就用迭代法

### 向量化

    def fit(self, x_train, y_train):
"""根据训练数据集x_train,y_train训练Simple Linear Regression模型"""
x_mean = np.mean(x_train)
y_mean = np.mean(y_train)

self.a_ = (x_train - x_mean).dot(y_train - y_mean) / (x_train - x_mean).dot(x_train - x_mean)
self.b_ = y_mean - self.a_ * x_mean

return self

## 回归算法的评价

### 均方误差MSE

def mean_squared_error(y_true, y_predict):
return np.sum((y_true - y_predict)**2) / len(y_true)

### 均方根误差RMSE (Root Mean Squared Error）

def root_mean_squared_error(y_true, y_predict):
"""计算y_true和y_predict之间的RMSE"""
return sqrt(mean_squared_error(y_true, y_predict))

### 平均绝对误差MAE（Mean Absolute Error)

def mean_absolute_error(y_true, y_predict):
"""计算y_true和y_predict之间的MAE"""

return np.sum(np.absolute(y_true - y_predict)) / len(y_true)

### R Square

• R^2 <=1

• R^2越大越好。当我们的预测模型不犯任何错误是，$R^2$ 得到最大值1

• 当我们的模型等于基准模型时，$R^2$为0

• 如果R^2<0，说明我们学习到的模型还不如基准模型。此时，很有可能我们的数据不存在任何线性关系。

def r2_score(y_true, y_predict):
"""计算y_true和y_predict之间的R Square"""

return 1 - mean_squared_error(y_true, y_predict)/np.var(y_true)

7个月前 评论

14

15

61

28