-
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<n或者某些特征是多余的,但伪逆总是有定义的
X_b=np.c_[np.ones((100, 1)), X]
np.linalg.pinv(X_b).dot(y)
#[[4.51562244]
#[2.98318706]]