机器学习之回归模型-一元线性回归理论与最小二乘法实现

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取到相应值时,使得损失函数最小,即线性拟合直线尽可能覆盖所有散点。

以上是关于机器学习之回归模型-一元线性回归理论与最小二乘法实现的主要内容,如果未能解决你的问题,请参考以下文章

一元线性回归的数学原理

机器学习之一元线性回归模型

备战数学建模17-回归分析算法

大数据分析机器学习之岭回归-医疗心率数据分析

机器学习-线性回归(基于R语言)

python机器学习之线性回归