赞
踩
线性回归算法(LinearRegression)就是假定一个数据集合预测值与实际值存在一定的误差, 然后假定所有的这些误差值符合正太分布, 通过方程求这个正太分布的最小均值和方差来还原原数据集合的斜率和截距。
当误差值无限接近于0时, 预测值与实际值一致, 就变成了求误差的极小值。
线性回归是机器学习中有监督机器学习下的一种算法。 回归问题主要关注的是因变量(需要预测的值,可以是一个也可以是多个)和一个或多个数值型的自变量(预测变量)之间的关系。
比如人的身高和全国的省份分布
比如:y = wx + b
最优解:尽可能的找到一个模型使得整体的误差最小,整体的误差通常叫做损失 Loss。
现实生活中,往往影响结果 y 的因素不止一个,这时 x 就从一个变成了 n 个,X1,X2…Xn同时简单线性回归的公式也就不在适用了。多元线性回归公式如下:
使用向量来表示,X表示所有的变量,是一维向量;W表示所有的系数(包含
w
0
w_0
w0),是一维向量,根据向量乘法规律.
最小二乘法可以将误差方程转化为有确定解的代数方程组(其方程式数目正好等于未知数的个数),从而可求解出这些未知参数。这个有确定解的代数方程组称为最小二乘法估计的正规方程。最小二乘法公式如下:
判定损失函数是凸函数的好处在于我们可能很肯定的知道我们求得的极值即最优解,一定是全局最优解。
人类社会很多事情都被大自然这种神奇的力量只配置:身高、体重、智商、相貌……这种神秘的力量就叫正态分布。大数学家高斯,深入研究了正态分布,最终推导出了线性回归的原理:最小二乘法!
误差等于第 i 个样本实际的值减去预测的值,公式可以表达为如下:
假定所有的样本的误差都是独立的,有上下的震荡,震荡认为是随机变量,足够多的随机变量叠加之后形成的分布,它服从的就是正态分布,因为它是正常状态下的分布,也就是高斯分布!均值是某一个值,方差是某一个值。 方差我们先不管,均值我们总有办法让它去等于零 0 的,因为我们这里是有截距b, 所有误差我们就可以认为是独立分布的,1<=i<=n,服从均值为 0,方差为某定值的高斯分布。机器学习中我们假设误差符合均值为0,方差为定值的正态分布.将误差定义到正太分布中.当样本足够多的时候,取样本的均值则为实际值.
随着参数μ和σ变化,概率分布也产生变化。 下面重要的步骤来了,我们要把一组数据误差出现的总似然,也就是一组数据之所以对应误差出现的整体可能性表达出来了,因为数据的误差我们假设服从一个高斯分布,并且通过截距项来平移整体分布的位置从而使得μ=0.
一元一次方程,在机器学习中一元表示一个特征,b表示截距,y表示目标值。
import numpy as np import matplotlib.pyplot as plt # 转化成矩阵 X = np.linspace(0,10,num = 30).reshape(-1,1) # 斜率和截距,随机生成 w = np.random.randint(1,5,size = 1) b = np.random.randint(1,10,size = 1) # 根据一元一次方程计算目标值y,并加上“噪声”,数据有上下波动~ y = X * w + b + np.random.randn(30,1) plt.scatter(X,y) # 重新构造X,b截距,相当于系数w0,前面统一乘以1 X = np.concatenate([X,np.full(shape = (30,1),fill_value= 1)],axis = 1) # 正规方程求解 θ = np.linalg.inv(X.T.dot(X)).dot(X.T).dot(y).round(2) # 根据公式计算 print('一元一次方程真实的斜率和截距是:',w, b) print('通过正规方程求解的斜率和截距是:',θ) # 根据求解的斜率和截距绘制线性回归线型图 plt.plot(X[:,0],X.dot(θ),color = 'green')
二元一次方程,x1, x2相当于两个特征,b是方程截距
import numpy as np import matplotlib.pyplot as plt from mpl_toolkits.mplot3d.axes3d import Axes3D # 绘制三维图像 # 转化成矩阵 x1 = np.random.randint(-150,150,size = (300,1)) x2 = np.random.randint(0,300,size = (300,1)) # 斜率和截距,随机生成 w = np.random.randint(1,5,size = 2) b = np.random.randint(1,10,size = 1) # 根据二元一次方程计算目标值y,并加上“噪声”,数据有上下波动~ y = x1 * w[0] + x2 * w[1] + b + np.random.randn(300,1) fig = plt.figure(figsize=(9,6)) ax = Axes3D(fig) ax.scatter(x1,x2,y) # 三维散点图 ax.view_init(elev=10, azim=-20) # 调整视角 # 重新构造X,将x1、x2以及截距b,相当于系数w0,前面统一乘以1进行数据合并 X = np.concatenate([x1,x2,np.full(shape = (300,1),fill_value=1)],axis = 1) w = np.concatenate([w,b]) # 正规方程求解 θ = np.linalg.inv(X.T.dot(X)).dot(X.T).dot(y).round(2) # 计算公式 print('二元一次方程真实的斜率和截距是:',w) print('通过正规方程求解的斜率和截距是:',θ.reshape(-1)) # # 根据求解的斜率和截距绘制线性回归线型图 x = np.linspace(-150,150,100) y = np.linspace(0,300,100) z = x * θ[0] + y * θ[1] + θ[2] ax.plot(x,y,z ,color = 'red')
一元线性回归
from sklearn.linear_model import LinearRegression import numpy as np import matplotlib.pyplot as plt # 转化成矩阵 X = np.linspace(0,10,num = 30).reshape(-1,1) # 斜率和截距,随机生成 w = np.random.randint(1,5,size = 1) b = np.random.randint(1,10,size = 1) # 根据一元一次方程计算目标值y,并加上“噪声”,数据有上下波动~ y = X * w + b + np.random.randn(30,1) plt.scatter(X,y) # 使用scikit-learn中的线性回归求解 model = LinearRegression() # 使用模型 model.fit(X,y) w_ = model.coef_ b_ = model.intercept_ print('一元一次方程真实的斜率和截距是:',w, b) print('通过scikit-learn求解的斜率和截距是:',w_,b_) plt.plot(X,X.dot(w_) + b_,color = 'green')
多元线性回归
import numpy as np import matplotlib.pyplot as plt from mpl_toolkits.mplot3d.axes3d import Axes3D from sklearn.linear_model import LinearRegression # 转化成矩阵 x1 = np.random.randint(-150,150,size = (300,1)) x2 = np.random.randint(0,300,size = (300,1)) # 斜率和截距,随机生成 w = np.random.randint(1,5,size = 2) b = np.random.randint(1,10,size = 1) # 根据二元一次方程计算目标值y,并加上“噪声”,数据有上下波动~ y = x1 * w[0] + x2 * w[1] + b + np.random.randn(300,1) fig = plt.figure(figsize=(9,6)) ax = Axes3D(fig) ax.scatter(x1,x2,y) # 三维散点图 ax.view_init(elev=10, azim=-20) # 调整视角 # 重新构造X,将x1、x2以及截距b,相当于系数w0,前面统一乘以1进行数据合并 X = np.concatenate([x1,x2],axis = 1) # 使用scikit-learn中的线性回归求解 model = LinearRegression() # 使用模型 model.fit(X,y) w_ = model.coef_.reshape(-1) b_ = model.intercept_ print('二元一次方程真实的斜率和截距是:',w,b) print('通过scikit-learn求解的斜率和截距是:',w_,b_) # # 根据求解的斜率和截距绘制线性回归线型图 x = np.linspace(-150,150,100) y = np.linspace(0,300,100) z = x * w_[0] + y * w_[1] + b_ ax.plot(x,y,z ,color = 'green')
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。