当前位置:   article > 正文

机器学习2-正规方程的学习_机器学习解方程

机器学习解方程

目录

一、最小二乘法矩阵表示:

​二、多元一次方程举例:

1、二元一次方程 

1、用线性代数解法:

 2、用正规方程解法:​

2、三元一次方程 

 正规方程解法:

3、八元一次方程 

1、正规方程解法: 

 2、sklearn算法解正规方程:


一、最小二乘法矩阵表示:

  最小二乘法可以将误差方程转化为有确定解的代数方程组(其方程式数目正好等于未知数的个数),从而可求解出这些未知参数。这个有确定解的代数方程组称为最小二乘法估计的正规方程。公式如下:

公式是如何推导的?

最小二乘法公式如下:

二、多元一次方程举例:

先导包:

  1. import numpy as np
  2. import matplotlib.pyplot as plt
  3. # linear线性,model模型、算法
  4. # LinearRegression:线性回归
  5. from sklearn.linear_model import LinearRegression

1、二元一次方程 

1、用线性代数解法:

  1. X = np.array([[1,1],[2,-1]])
  2. X

  1. y = np.array([14,10])
  2. y

 

  1. # linalg 线性代数,slove计算线性回归问题
  2. np.linalg.solve(X,y)

 2、用正规方程解法:

  1. A = X.T.dot(X)
  2. # 逆矩阵
  3. B = np.linalg.inv(A)
  4. # 向量点乘运算
  5. C = B.dot(X.T)
  6. C.dot(y)

2、三元一次方程 

 

 正规方程解法:

  1. X = np.array([[1,-1,1],[2,1,-1],[3,-2,6]])
  2. y = np.array([100,80,256])
  3. w = np.linalg.inv(X.T.dot(X)).dot(X.T).dot(y)

3、八元一次方程 

1、正规方程解法: 

  1. # 上面八元一次方程对应的X数据
  2. X = np.array([[ 0 ,14 , 8 , 0 , 5, -2, 9, -3],
  3. [ -4 , 10 , 6 , 4 ,-14 , -2 ,-14 , 8],
  4. [ -1 , -6 , 5 ,-12 , 3 , -3 , 2 , -2],
  5. [ 5 , -2 , 3 , 10 , 5 , 11 , 4 ,-8],
  6. [-15 ,-15 ,-8 ,-15 , 7 , -4, -12 , 2],
  7. [ 11 ,-10 , -2 , 4 , 3 , -9 , -6 , 7],
  8. [-14 , 0 , 4 , -3 , 5 , 10 , 13 , 7],
  9. [ -3 , -7 , -2 , -8 , 0 , -6 , -5 , -9]])
  10. # 对应的y
  11. y = np.array([ 339 ,-114 , 30 , 126, -395 , -87 , 422, -309])
  12. display(X,y)

 

  1. # 正规方程
  2. w = np.linalg.inv(X.T.dot(X)).dot(X.T).dot(y)
  3. w

 2、sklearn算法解正规方程:

  1. # fit_intercept = False 不计算截距!!!
  2. model = LinearRegression(fit_intercept = False)
  3. # X 数据;y 目标值
  4. # X ---> y
  5. # 查看X,y
  6. display(X,y)
  7. # 计算结果
  8. model.fit(X,y)
  9. # coef_ 结果,返回值
  10. # 系数,斜率,W,方程的解
  11. model.coef_

 

  1. # 默认计算截距
  2. model.intercept_

 

如果我们fit_intercept=False中的False改成True,要让它计算截距怎么办呢?

我们需要自行增加截距!我设截距为12.

  1. # 设截距是12
  2. # 目标值进行移动,向上移动,加法运算
  3. print('截距是0:',y)
  4. y += 12
  5. print('增加了截距',y)

 

 首先我们要清楚线性回归的方程解析式:

 其中b是一个未知变量,需要进行方程求解。我们可以把b看做w0*1。

这样我们可以对每一个方程新增加一列1:

  1. # 向其后面增加一列
  2. X = np.concatenate([X,np.full(shape = (8,1),fill_value=1)],axis = 1)
  3. X

 正规方程求解: 

np.linalg.inv(X.T.dot(X)).dot(X.T).dot(y)

 sklearn算法求解:

  1. model = LinearRegression(fit_intercept=False)
  2. model.fit(X,y)
  3. display(model.coef_,model.intercept_)

 从两种方法求解的结果可知,结果并不是正确的。什么原因呢?

        我们先看看X的形状:

X.shape

        原因如下:8代表8个方程,9代表计算的未知数。当我们增加了新的一列,意味着未知数都增加了一个,但是方程个数没有增加。即8个9元1次方程,没有固定解,我们还需要增加一个新的方程变成9个9元1次方程,这样才有唯一解!!!

 增加一个方程:

  1. # 第9个方程
  2. X9 = np.random.randint(-15,15,size = 8)
  3. X9

  1. # 标准答案
  2. w = np.array([ 1., 5., 15., 3., 8., 4., 17., 12.])
  3. # 上面的8个方程,都有截距是12,第九个方程也一样
  4. X9.dot(w) + 12
  5. y = np.concatenate([y,[X9.dot(w) + 12]])
  6. y

  1. # 第9个方程增加一列1
  2. X9 = np.concatenate([X9,[1]])
  3. X9

  1. # 将第九个方程和前面八个方程合并
  2. X = np.concatenate([X,[X9]])
  3. X

 先用正规方程求解9个9元1次方程是否正确:

np.linalg.inv(X.T.dot(X)).dot(X.T).dot(y)

 从结果可知,是正确的!然后我们用sklearn算法试试:

计算截距时:

  1. # 四舍五入,截距:12
  2. model = LinearRegression(fit_intercept=True)
  3. model.fit(X,y)
  4. display(model.coef_,model.intercept_)

 从结果可知,array中有个0,这怎么理解呢?

        我们可以理解成权重,0代表的是没有权重,意思是我们在计算截距的时候,w0是我们自己假设出来的(因为在原方程中并没有截距),sklearn最终在计算的时候,把他理解成0权重了。而计算出的截距为11.999999时,我们自动四舍五入就好了。而计算出的截距为11.999999时,我们自动四舍五入就好了。

未计算截距时:

  1. model = LinearRegression(fit_intercept=False)
  2. model.fit(X,y)
  3. display(model.coef_,model.intercept_)

 

 从计算结果可知结果是正确的!

当我们把截距去掉时,变成9个8元一次方程时,再计算截距再来看看结果:

我们先看看X是怎样的:

X

去掉1后: 

  1. # [:-x] 表示 除了最后 x 个元素构成的切片
  2. # [-x:] 表示 最后 x 个元素构成的切片
  3. X[:,:-1]

 计算结果:

  1. # 四舍五入,截距:12
  2. model = LinearRegression(fit_intercept=True)
  3. # 截距去掉!
  4. model.fit(X[:,:-1],y)
  5. display(model.coef_,model.intercept_)

 从结果可知,array中只有8位,截距为11.99999999,四舍五入进为12就好了。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/279462
推荐阅读
相关标签
  

闽ICP备14008679号