前言
本文属于 线性回归算法【AIoT阶段三】(尚未更新),这里截取自其中一段内容,方便读者理解和根据需求快速阅读。
线性回归是机器学习中有监督机器学习下的一种算法。 回归问题主要关注的是因变量(需要预测的值,可以是一个也可以是多个)和一个或多个数值型的自变量(预测变量)之间的关系。
需要预测的值:即目标变量,target,y,连续值预测变量。
影响目标变量的因素:X 1…X n ,可以是连续值也可以是离散值。
因变量和自变量之间的关系:即模型,model,是我们要求解的。
1.基本概念
1.1 连续值
🚩连续值就是连续的一连串数字,是可以无限细分下去的一段,比如我们的身高,你可以说你身高在 175至185 ,继续细分下去也是可以的,你甚至可以说你的身高在 175.003 至 182.231 182.231 甚至继续下分下去也没可以的,这就被称为是连续值。
1.2 离散值
🚩离散值就是单个孤立的点,比如我国共计34个省级行政区,我们绝不可以说成我国共计34.3个省级行政区,或者是33.6个省级行政区,必须是 34 整个,这就是离散值。
1.3 简单线性回归
1.4 基本名词的定义
1.5 多元线性回归
2.正规方程
2.1 最小二乘法的矩阵表示
🚩最小二乘法可以将误差方程转化为有确定解的代数方程组(其方程式数目正好等于未知数的个数),从而可求解出这些未知参数。这个有确定解的代数方程组称为最小二乘法估计的正规方程。公式如下:
公式是如何推导的在 2.4 推导正规方程 θ \thetaθ 的解 中进行详细讲解。
最小二乘法公式如下:
使用矩阵表示:
之所以要使用转置 T ,是因为,矩阵运算规律是:矩阵 A 的一行乘以矩阵 B 的一列!
2.2 多元一次方程举例
2.2.1 二元一次方程
import numpy as np import matplotlib.pyplot as plt X = np.array([[1, 1], [2, -1]]) y = np.array([14, 10]) # linalg 线性代数,solve计算线性回归问题 np.linalg.solve(X, y)
我们来根据上述中的正规方程来计算一下:
A = X.T.dot(X) B = np.linalg.inv(A) ## 求逆矩阵 C = B.dot(X.T) C.dot(Y)
可以发现,我们使用正规方程可以同样有效的进行计算,我们再来举几个例子
2.2.2 三元一次方程
import numpy as np import matplotlib.pyplot as plt X = np.array([[1, -1, 1], [2, 1, -1], [3, -2, 6]]) y = np.array([100, 80, 256]) # 根据正规方程进行计算: W = np.linalg.inv(X.T.dot(X)).dot(X.T).dot(y) W
2.2.3 八元一次方程
import numpy as np import matplotlib.pyplot as plt X = np.array([[0, 14, 8, 0, 5, -2, 9, -3], [-4, 10, 6, 4, -14, -2, -14, 8], [-1, -6, 5, -12, 3, -3, 2, -2], [5, -2, 3, 10, 5, 11, 4, -8], [-15, -15, -8, -15, 7, -4, -12, 2], [11, -10, -2, 4, 3, -9, -6, 7], [-14, 0, 4, -3, 5, 10, 13, 7], [-3, -7, -2, -8, 0, -6, -5, -9]]) y = np.array([339, -114, 30, 126, -395, -87, 422, -309]) # 根据正规方程进行计算: W = np.linalg.inv(X.T.dot(X)).dot(X.T).dot(y) W
2.2.4 sklearn 算法使用
🚩没有安装这个包的同学在命令行中输入:pip install sklearn
即可,如果你看过博文:最详细的Anaconda Installers 的安装【numpy,jupyter】(图+文) 或者 数据分析三剑客【AIoT阶段一(下)】(十万字博文 保姆级讲解),那么这一步可省略:在安装jupyter的时候已经安装完成,如果你没有设置以 清华源 为地址进行下载会很慢,配置默认下载从 清华源 下载可见博文:matplotlib的安装教程以及简单调用
下面还是来计算我们上述的八元一次方程组:
# linear:线性 model:模型、算法 # LinearRegression: 线性回归 from sklearn.linear_model import LinearRegression import numpy as np import matplotlib.pyplot as plt model = LinearRegression() X = np.array([[0, 14, 8, 0, 5, -2, 9, -3], [-4, 10, 6, 4, -14, -2, -14, 8], [-1, -6, 5, -12, 3, -3, 2, -2], [5, -2, 3, 10, 5, 11, 4, -8], [-15, -15, -8, -15, 7, -4, -12, 2], [11, -10, -2, 4, 3, -9, -6, 7], [-14, 0, 4, -3, 5, 10, 13, 7], [-3, -7, -2, -8, 0, -6, -5, -9]]) y = np.array([339, -114, 30, 126, -395, -87, 422, -309]) # X:数据 y:目标值 model.fit(X, y) # coef_ : 结果、返回值 # 就是指方程的解、W、系数、斜率 model.coef_
我们发现,运行结果和我们用正规方程计算出来的不一样,这是因为在代码:
model = LinearRegression()
有一个参数叫做:intercept_
,意为截距,即我们调用sklearn 自动计算了截距:
# 默认计算截距 model.intercept_
但其实我们的八元一次方程是没有截距的,故我们在代码改为如下即可:
model = LinearRegression(fit_intercept = False)
完整代码:
# linear:线性 model:模型、算法 # LinearRegression: 线性回归 from sklearn.linear_model import LinearRegression import numpy as np import matplotlib.pyplot as plt model = LinearRegression(fit_intercept = False) X = np.array([[0, 14, 8, 0, 5, -2, 9, -3], [-4, 10, 6, 4, -14, -2, -14, 8], [-1, -6, 5, -12, 3, -3, 2, -2], [5, -2, 3, 10, 5, 11, 4, -8], [-15, -15, -8, -15, 7, -4, -12, 2], [11, -10, -2, 4, 3, -9, -6, 7], [-14, 0, 4, -3, 5, 10, 13, 7], [-3, -7, -2, -8, 0, -6, -5, -9]]) y = np.array([339, -114, 30, 126, -395, -87, 422, -309]) # X:数据 y:目标值 model.fit(X, y) # coef_ : 结果、返回值 # 就是指方程的解、W、系数、斜率 model.coef_
此时我们再来计算一下截距:
model.intercept_