关键词

Python中实现最小二乘法思路及实现代码

让我来详细讲解一下“Python中实现最小二乘法思路及实现代码”的完整攻略。

什么是最小二乘法

最小二乘法是一种回归分析方法,通过对一组数据进行拟合,得到一条通过这些点的直线,使得这些点到这条直线的距离之和最小。而距离是指每个点到直线的垂线距离。通过最小二乘法我们可以得到一个最优解,这个最优解是基于误差平方和最小化的。

应用最广泛的应该是线性回归了,下面我们就以线性回归为例子讲解一下如何在 Python 中实现最小二乘法。

线性回归模型

在一元线性回归中,假设我们有一个因变量 $y$,一个自变量 $x$,则线性回归模型可以表示为:

$$y = \beta_0 + \beta_1x + \epsilon$$

其中,$\beta_0$ 表示 $x=0$ 时 $y$ 的值,$\beta_1$ 表示 $y$ 随着 $x$ 的变化所增加的量,$\epsilon$ 是误差项。

我们希望对于给定的自变量 $x_i$ 和因变量 $y_i$,通过最小二乘法来确定模型的参数 $\beta_0, \beta_1$。

最小二乘法思路

最小二乘法的思路是:

  1. 确定线性关系:$y=\beta_0+\beta_1 x$
  2. 给出样本数据集 $(x_1,y_1), (x_2,y_2),\ldots,(x_n,y_n)$
  3. 确定误差函数:$E=\sum_{i=1}^{n}{(y_i-\hat{y}_i)^2}$,其中 $\hat{y}_i=\beta_0+\beta_1 x_i$ 表示模型预测的值
  4. 对误差函数求导,得到模型参数 $\beta_0, \beta_1$ 的最优解。

下面,我们将根据上述的四个步骤,来进行 Python 代码实现。

实现代码

首先需要导入 NumPy 和 Matplotlib 这两个库。其中,NumPy 将用于计算矩阵的逆和相关操作,Matplotlib 则用于绘制图形。

import numpy as np
import matplotlib.pyplot as plt

然后我们定义一个函数来实现最小二乘法:

def linear_regression(x, y):
    n = np.size(x)
    m_x, m_y = np.mean(x), np.mean(y)
    SS_xy = np.sum(y * x - n * m_y * m_x)
    SS_xx = np.sum(x * x - n * m_x * m_x)
    beta_1 = SS_xy / SS_xx
    beta_0 = m_y - beta_1 * m_x
    return beta_0, beta_1

这里需要注意,在计算相关系数时,需要使用 NumPy 库中的 sum() 函数。该函数会按照给定参数进行求和操作。

最后,我们可以生成一组虚构的数据,然后进行拟合,绘制图形:

x = np.array([2, 4, 6, 8, 10])
y = np.array([4, 7, 8, 9, 12])

b_0, b_1 = linear_regression(x, y)
plt.scatter(x, y, color = "m", marker = "o", s = 30)

y_pred = b_0 + b_1 * x
plt.plot(x, y_pred, color = "g")

plt.xlabel('x')
plt.ylabel('y')

plt.show()

其中,我们首先定义了一组虚构的数据 $x$ 和 $y$,通过之前的 linear_regression 函数计算得到拟合的直线,最后使用 Matplotlib 绘制图形。

下面展示另一个示例,使用最小二乘法预测房价:

import pandas as pd
from sklearn import linear_model
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error, r2_score

# 读取数据集
house_data = pd.read_csv('house_data.csv')

# 分割自变量和因变量
X = house_data.iloc[:, :-1]
y = house_data.iloc[:, -1]

# 分割训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)

# 定义线性回归模型并训练
regr = linear_model.LinearRegression()
regr.fit(X_train, y_train)

# 模型预测
y_pred = regr.predict(X_test)

# 计算误差和准确率
print('Mean squared error: %.2f'
      % mean_squared_error(y_test, y_pred))
print('Coefficient of determination: %.2f'
      % r2_score(y_test, y_pred))

以上代码中,我们使用了一个名为 house_data 的数据集。首先我们将数据集读入数据框中,然后分割自变量和因变量,然后将训练集和测试集分割开来。接下来我们定义了一个线性回归模型 regr,并将训练数据集 X_trainy_train 传递到模型中进行训练。最后,我们可以用 regr 对测试集 X_test 进行预测,然后计算误差和准确率。

上述两个示例,一个是手动实现了最小二乘法,而另一个则使用了 Scikit-learn 库中的线性回归模型,只需调用相关库即可,无需手动实现。

本文链接:http://task.lmcjl.com/news/16653.html

展开阅读全文