线性回归
分类: 目标值离散
回归: 目标值连续
线性回归:寻找一种能预测的趋势
线性关系: -二维:直线关系 -三维:平面
线性关系定义
参数b,偏置项,为了对于单个特征的情况更加通用
参数k,权重
线性回归定义:
线性回归通过一个或多个自变量与因变量之间进行建模的回归分析
一元线性回归:变量只有一个
多元线性回归:变量两个或以上
通用公式:
其中w,x为矩阵
属性和权重的组合来预测结果
矩阵
数组 矩阵 0维 1 1维 [1, 2, 3] 2维 [ 必须是二维的 [1, 2, 3], 满足了特定的运算要求 [4, 5, 6] ] 3维 [[ [1, 2, 3], [4, 5, 6] ],[ [1, 2, 3], [4, 5, 6] ]]
数组的运算:加法,乘法
numpy.ndarray
矩阵乘法:
(m行,l列) * (l行,n列) = (m行,n列)
特征值 权重 目标值 [[1, 2, 3, 4]] [[1], [2], [3], [4]] 一个样本一个值 (1, 4) (4, 1) (1,1) (100, 4) (4, 1) (100,1)
数组相乘
import numpy as np a = [ [1, 2, 3, 4], [5, 6, 7, 8], [1, 4, 3, 5] ] b = [2, 2, 2, 2] np.multiply(a, b) Out[5]: array([[ 2, 4, 6, 8], [10, 12, 14, 16], [ 2, 8, 6, 10]])
矩阵相乘
import numpy as np a = [ [1, 2, 3, 4], [5, 6, 7, 8], [1, 4, 3, 5] ] c = [ [2], [2], [2], [2] ] np.dot(a, c) Out[9]: array([[20], [52], [26]])
线性回归
求函数中的参数w,使得损失函数最小
迭代的算法
损失函数(误差大小)
y i为第i个训练样本的真实值
h w ( x i ) h_w(x_i)h w (x i ) 为第i个训练赝本特征值组合预测函数
又称为最小二乘法
尽量去减少损失,算法的自我学习过程
算法 策略(损失函数) 优化 线性回归 误差平方和 正规方程 最小二乘法 梯度下降
最小二乘法之正规方程
X XX 为特征矩阵
y yy 为目标值矩阵
缺点:当特征过于复杂,求解速度太慢
X T X^TX T 转置X − 1 X^-1X − 1 求逆 -> X ∗ ? = 单 位 矩 阵 X * ? = 单位矩阵X∗?=单位矩阵
单位矩阵
[ [1, 0, 0], [0, 1, 0], [0, 0, 1] ]
最小二乘法之梯度下降
方向
a是学习速率
沿着这个函数下降的方向找,最后就能找到山谷的最低点,然后更新w值
使用:面对训练数据规模十分庞大的任务
线性回归API
普通最小二乘线性回归
sklearn.linear_model.LinearRegression
coef_ 回归系数
使用SGD最小线性模型
sklearn.linear_model.SGDRegressor
coef_ 回归系数
scikit-learn
优点:封装好,建立模型简单,预测简单
缺点:算法过程,参数都在算法内部优化
v0.18
v0.19 转换器 estimator 要求数据必须是二维数据
reshape(-1, 1)
TensorFlow
封装高低都有,自己实现线性回归
回归性能评估
均方误差(Mean Squared Error)MSE评价机制
预测值
真实值
梯度下降和正规方程区别
代码示例
# -*- coding: utf-8 -*- from sklearn.datasets import load_boston from sklearn.linear_model import LinearRegression, SGDRegressor from sklearn.preprocessing import StandardScaler from sklearn.model_selection import train_test_split from sklearn.metrics import mean_squared_error # 加载数据 boston = load_boston() # 训练集,测试集拆分 X_train, X_test, y_train, y_test = train_test_split( boston.data, boston.target, test_size=0.25) # 数据标准化处理 # 特征值 标准化 std_x = StandardScaler() X_train = std_x.fit_transform(X_train) X_test = std_x.transform(X_test) # 目标值 标准化 std_y = StandardScaler() y_train = std_y.fit_transform(y_train.reshape(-1, 1)) y_test = std_y.transform(y_test.reshape(-1, 1)) # 正规方程 线性回归预测 lr = LinearRegression() lr.fit(X_train, y_train) print(lr.coef_) y_lr_predict = std_y.inverse_transform(lr.predict(X_test)) print(y_lr_predict) # 梯度下降 线性回归预测 sgd = SGDRegressor() sgd.fit(X_train, y_train) print(sgd.coef_) y_sgd_predict = std_y.inverse_transform(sgd.predict(X_test)) print(y_sgd_predict) # 性能评估 均方误差 lr_mse = mean_squared_error(std_y.inverse_transform(y_test), y_lr_predict) sgd_mse = mean_squared_error(std_y.inverse_transform(y_test), y_sgd_predict) print(lr_mse) # 28.97 print(sgd_mse) # 31.36