线性模型

  • 1. 基本形式

即已知x,y通过机器学习的算法求得w与b


  • 2.线性回归

  • 2.1 问题描述

  • 2.2 一元线性回归

  • 2.2.1 问题描述

只有一个属性,即d=1
w,b为单个的数

  • 2.2.2 目标函数

均方误差对应了常用的欧几里得距离简称“欧氏距离”,基于均方误差最小化来进行模型求解的方法称为“最小二乘法”

  • 2.2.3 目标函数求解与证明
  • 2.2.4 模拟实验
  • 方法一

随机生成一些先行数据集

import numpy as np
from matplotlib import pyplot as plt
x=2*np.random.rand(100,1)
y=4 + 3*x + np.random.rand(100,1)
plt.scatter(x,y,s=10,color='g',marker='*',alpha=0.4)
y=range(0,16,2)
plt.yticks(y)
plt.xlabel('X1')
plt.ylabel('y')
plt.show()

使用标准方程来计算θ^,使用numpy的线性代数模块(np.linalg)中的inv()函数来对矩阵求逆,并用dot()方法计算矩阵的内积:

import numpy as np
from matplotlib import pyplot as plt
X=2*np.random.rand(100,1)
X=np.matrix(X)
y=4 + 3*X + np.random.rand(100,1)
y=np.matrix(y)
X_b=np.c_[np.ones((100, 1)), X]
theta_best=np.linalg.inv(X_b.T.dot(X_b)).dot(X_b.T).dot(y)
print(theta_best)

实际用来生成数据的函数是y=4+3*x1+高斯噪声
实验的公式结果

[[4.49764198]
 [2.95571874]]

非常接近,噪声的存在,其不可能完全还原为原本的函数
现在用θ^做出预测

X_new=np.array([[0],[2]])
X_new_b=np.c_[np.ones((2,1)),X_new]

y_predict=X_new_b.dot(theta_best)

plt.plot(X_new,y_predict,'r-')
plt.plot(X,y,'b.')
plt.axis([0,2,0,15])
plt.show()
  • 方法二

使用Scikit-Learn执行线性回归

lin_reg=LinearRegression()
lin_reg.fit(X,y)
#[4.49079138] [[3.01587697]]
X_new=np.array([[0],[2]])
X_new_b=np.c_[np.ones((2,1)),X_new]
lin_reg.predict(X_new)
#[[ 4.51503205]
#[10.45564916]]
  • 方法三

LinearRegression类基于scipy.linalg.lstsq()函数(名称代表“最小二乘”)

X_b=np.c_[np.ones((100, 1)), X]

theta_best_svd,residuals,rank,s=np.linalg.lstsq(X_b,y,rcond=1e-6)
#[[4.4350753]
#[3.0726514]]
  • 方法四(★★★)

使用np.linalg.pinv()来计算这个伪逆,这种方法比计算标准方程更有效,再加上它可以很好地处理边界情况:的确,如果矩阵XтX是不可逆的,标准方程可能没有解,例如m

X_b=np.c_[np.ones((100, 1)), X]

np.linalg.pinv(X_b).dot(y)
#[[4.51562244]
 #[2.98318706]]

你可能感兴趣的:(线性模型)