机器学习之回归模型-一元线性回归理论与最小二乘法实现
Posted nuist__NJUPT
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了机器学习之回归模型-一元线性回归理论与最小二乘法实现相关的知识,希望对你有一定的参考价值。
机器学习之回归模型-一元线性回归理论与最小二乘法实现
线性回归是一种线性模型,它假设输入变量x与单个输出变量y之间存在线性关系。
具体的说,就是利用线性回归模型,从一组输入变量的线性组合中,计算出输出变量y。
如下图所示,只有一次项,我们称之为线性。
正常我们求解线性方程的方式如下所示:当我们有两组数据,我们就可以带入求解出系数,若再有一组值,则可以带入验证。
正常两个点确定一条直线,但是实际情况往往是海量数据,而不是2组数据,即大量的点,而不是两个点,我们要的是一条尽量可能拟合这些点分布状态的一条直线,即所有点到直线的距离之和最小,即损失函数最小。
给定d个属性描述的示例x(x1,x2…xd),xi是x在第i个属性上的取值,线性模型试图学得一个通过属性的线性组合来进行预测的函数。如下图所示。
其中:不做特殊说明,默认为列向量,下面公式就是一个行向量乘以一个列向量得到一个值。
我对最小二乘法得理解:
基于均方差误差最小化得方式进行求解得方法称为最小二乘法。说白了就是选择未知参数,使得理论值和实际值之差得平方和达到最小。
我们假设输入属性得个数只有一个,可得到如下公式:
正常情况下,输入属性是有多个,在线性回归中,最小二乘法就是找到一条直线,使得样本到所有直线得欧氏距离最小。我们最后求得得是函数取得最小值时候的参数。
我们的函数是一个二次的函数,图像为抛物线,开口向上,二元函数,直接分别对参数w和b求偏导,并令导数等于0,导数为0的点就是函数的最小值点,也就是误差最小时候,此时的参数w,b就是我们要求的。
采用数据集data.csv,画出散点图,带入公式做出线性回归拟合直线,求出参数值w,b,并求出此时的最小损失函数,即误差最小,使得线性回归直线尽可能覆盖所有散点。下面是一元线性回归实现的代码:
demo同步到了github,包含数据集和代码段,链接如下:
https://github.com/wgdwg/-
#最小二乘法实现线性回归
import numpy as np #导入计算包
import matplotlib.pyplot as plt #导入绘图包
#1.加载数据源,并画出散点图
points = np.genfromtxt('data.csv', delimiter=',')
#提取points的两列数据,分别作为x,y
x = points[:,0] #第一列数据
y = points[:,1] #第2列数据
#用plt画出散点图
plt.scatter(x,y)
plt.show()
#2.定义损失函数,损失函数是系数的函数
def cost_function(w, b, points):
total_const = 0 #初始化损失函数
m = len(points) #数据个数
#逐点计算平方误差,然后求平均数
for i in range(m):
x = points[i,0] #第i行,第1列
y = points[i,1] #第i行,第2列
total_const += (y - w * x - b) ** 2
return total_const / m
#3.定义算法拟合函数
#平均值函数
def average(data):
sum = 0
num = len(data)
for i in range(num):
sum += data[i]
return sum / num
#定义核心拟合函数
def fit(points):
m = len(points)
x_bar = average(points[:,0]) #x的均值
sum_yx = 0
sum_x2 = 0
sum_delta = 0
for i in range(m):
x = points[i, 0] # 第i行,第1列
y = points[i, 1] # 第i行,第2列
sum_yx += y * (x - x_bar)
sum_x2 += x ** 2
#根据公式计算w
w = sum_yx / (sum_x2 - m * (x_bar ** 2))
for i in range(m):
x = points[i, 0] # 第i行,第1列
y = points[i, 1] # 第i行,第2列
sum_delta += (y - w * x)
#根据公式求b
b = sum_delta / m
return w, b
#4.测试
w, b = fit(points) #得到参数w,b
cost = cost_function(w,b,points) #得到损失函数
print("参数w = ", w)
print("参数b = ", b)
print("损失函数 = ", cost)
#5.画图拟合曲线
plt.scatter(x,y) #原始的散点图
pred_y = (w * x) + b #预测的y
plt.plot(x,pred_y,c='r') #红色的拟合直线
plt.show() #显示绘图
原始数据的散点图:
线性拟合的结果:
控制台输出的当参数w和b取到相应值时,使得损失函数最小,即线性拟合直线尽可能覆盖所有散点。
以上是关于机器学习之回归模型-一元线性回归理论与最小二乘法实现的主要内容,如果未能解决你的问题,请参考以下文章