线性回归

时间:2022-07-23
本文章向大家介绍线性回归,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

线性回归

概述

本部分为自己学习部分机器学习算法中的一部分笔记及感想,我的方向和机器学习无关,可能对一些问题分析的并不准确,有问题欢迎一起探讨商榷。由于这是第一篇推文,因此首先介绍一些基本概念性东西。创作不易,点个“在看”呗。

数学模型

不知道大家有没有数学建模的经历,我还记得大一时听到数学建模这玩意就浑身犯怵,一方面害怕数学

,另一方面不知道模型为何物。后来随着自己接触到数学建模,发觉他也不是不可靠近的......

说了这么多,其实就是想要说一下模型。在数学建模里面,所谓模型就是找到数据与数据之间的关系,根据关系去解决实际问题。

其实在机器学习中,模型也可以用上面的方法来理解,根据已有数据找数据关系,将关系存储下来,输入新的数据进已有关系,得到一个结果。具体可用下面一个图来解释。

所谓机器学习,无非就是利用海量数据去训练出来一个比较好的模型,利用训练好的模型去处理实际问题。而在训练模型时,不同问题又有着各自不同的训练方法,进而催生了大量的机器学习算法。

线性回归

对于线性回归,首先需要去理解其基本概念。可将“线性回归”拆分为“线性”和“回归”两个词来理解。

1.线性和非线性

线性:两个变量成一次函数关系,在图像上表现为图像为直线。

非线性:与线性相对,两个变量不是一次函数关系,图像不是直线。

2.回归

确定两种或两种以上变量间相互依赖的定量关系的一种统计分析方法。回归分析按照涉及的变量的多少,分为一元回归和多元回归分析;按照因变量的多少,可分为简单回归分析和多重回归分析;按照自变量和因变量之间的关系类型,可分为线性回归分析和非线性回归分析。

PS:利用已有数据跑出来的模型去求解问题时或多好少都会有些偏差,关于这类的相关概念就不说了,只会说一下对于某一类算法而言尤其需要注意的问题。如对于回归类问题而言,欠拟合和过拟合问题就显得格外值得关注(当然对于其他模型训练时也很重要)。

欠拟合和过拟合

在模型训练时,模型的泛化能力越强就说明这个模型表现越好。所谓泛化能力可以理解为:你用一个数据集训练的模型不能只在这个模型好使,在其他数据集上也要好使。

1.欠拟合

训练集的预测值,与训练集的真实值有不少的误差,称之为欠拟合。

2.过拟合

训练集的预测值,完全贴合训练集的真实值,称之为过拟合。

欠拟合和过拟合在回归上表现为:一个预测结果偏离真实值,一个预测结果过分接近真实值。

其中过拟合没找到例子就用原直线了。

实现线性回归

理论结束,我们现在开始写代码,实现一元线性回归。

1.动手实现

(1)定义训练数据

# 定义训练数据
x = np.array([1, 3, 2, 1, 3])
y = np.array([19, 24, 18, 17, 27])

(2)回归方程求解

求解回归方程中的两个参数:斜率和截距

# 回归方程求取函数
def fit(x, y):
    if len(x) != len(y):
        return
    numerator = 0.0
    denominator = 0.0
    x_mean = np.mean(x)
    y_mean = np.mean(y)
    for i in range(len(x)):
        numerator += (x[i] - x_mean) * (y[i] - y_mean)
        denominator += np.square((x[i] - x_mean))
    print('numerator:', numerator, 'denominator:', denominator)
    b0 = numerator / denominator
    b1 = y_mean - b0 * x_mean
    return b0, b1

(3)返回回归方程

b0, b1 = fit(x, y)
print('Line is:y = %2.0fx + %2.0f' % (b0, b1))

(4)根据回归方程对未来数据预测

# 预测
x_test = np.array([0.5, 1.5, 2.5, 3, 4])
y_test = np.zeros((1, len(x_test)))
for i in range(len(x_test)):
    y_test[0][i] = predit(x_test[i], b0, b1)

结果如下:蓝色点为训练,红色为测试。

2.调用库实现

其实上面说了这么多可能对于很多人一点用都没有,我们都是站在巨人肩膀上的,别人已经将计算库写好,使用时一句话就ok了。下面是直接调用别人库的写法。

import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression
from matplotlib.font_manager import FontProperties
import numpy as np

myfont = FontProperties(fname='D:/python_pycharm/front/simhei.ttf')
x = [1, 2, 3, 4, 5, 6, 7, 8, 9]
y = [1, 2, 3, 4, 5, 6, 9, 10, 11]

x = np.reshape(x, newshape=(9, 1))
y = np.reshape(y, newshape=(9, 1))
# 调用模型
lr = LinearRegression()
# 训练模型
lr.fit(x, y)
# 计算R平方
print(lr.score(x, y))
# 计算y_hat
y_hat = lr.predict(x)
plt.scatter(x, y)
plt.plot(x, y_hat)
plt.title('线性回归', fontproperties=myfont)
plt.show()

总结

以上只演示了线性回归(一元),对于多元回归,思路都是一样的,大致实现也差不多,只需要把高维数据处理一下即可,在这里就不再说了。毕竟本文是讲线性回归。