Numpy 多元多项式回归入门

Numpy 多元多项式回归入门

随着数据科学技术的迅速发展,多项式回归已经成为数据分析领域中的一种基本方法。多项式回归是一种基于多项式函数的回归模型,它可以用来通过变量之间的复杂关系来拟合数据。在这个主题中,我们将介绍如何使用Numpy进行多元多项式回归,并提供一些示例来加深理解。

阅读更多:Numpy 教程

多项式回归的基本原理

在多项式回归中,我们使用一组基函数来拟合输入的数据。最基本的基函数是一次函数,它的形式为:

h(x)=wx+bh(x) = wx + b

其中,wwbb表示回归系数,分别表示斜率和截距。一次函数只能拟合线性数据,对于非线性的数据就无能为力。因此,我们需要使用更高次的基函数。例如,二次函数的形式为:

h(x)=w0+w1x+w2x2h(x) = w_0 + w_1x + w_2x^2

这个函数可以拟合二次数据,它比一次函数更为灵活。同样的,我们可以使用更高次的函数来适应更复杂的数据。例如,三次函数的形式为:

h(x)=w0+w1x+w2x2+w3x3h(x) = w_0 + w_1x + w_2x^2 + w_3x^3

为了将这些基函数拟合到原始数据上,我们需要选择一个拟合误差函数。常见的误差函数是均方误差(MSE),如下所示:

MSE=1ni=1n(yih(xi))2MSE = \frac{1}{n}\sum_{i=1}^{n}(y_i – h(x_i))^2

其中,yiy_i表示真实值,h(xi)h(x_i)表示基函数模型对数据的预测值。目标是让误差函数取到最小值。

Numpy实现多元多项式回归

在Python中,我们可以使用Numpy来实现多元多项式回归。假设我们有一个二元数据,它的输入变量为x1x_1x2x_2,输出变量为yy。我们可以使用二次函数和均方误差来拟合这些数据。下面是使用Numpy实现的代码:

import numpy as np

# 构造输入数据
x = np.array([[1, 2], [2, 3], [3, 4], [4, 5]])

# 构造输出数据
y = np.array([5, 14, 25, 40])

# 构造齐次项矩阵
n = 2
p = 3
X = np.zeros((len(x), n * p + 1))
for i in range(len(x)):
    for j in range(n):
        for k in range(n):
            X[i, j * n + k] = x[i, j] * x[i, k]
    X[i, n*p] = 1

# 计算回归系数
w = np.dot(np.linalg.inv(np.dot(X.T, X)), np.dot(X.T, y))

# 输出结果
print("回归系数:", w)
Python

这段代码中,我们首先构造了输入和输出的二元数据。接着,我们使用numpy.zeros()函数创建一个12×712\times7的齐次项矩阵XX,其中第ii行的元素为x1,i,x2,i,x1,i2,x1,ix2,i,x2,i2,x1,i,1x_{1,i},x_{2,i},x_{1,i}^2,x_{1,i}x_{2,i},x_{2,i}^2,x_{1,i},1。注意最后一个11代表常数项。

然后,我们使用Numpy的线性代数函数numpy.linalg.inv()numpy.dot()来计算回归系数。最后,我们输出回归系数的值。

示例:二元数据的多元多项式回归

为了更好地理解释多项式回归的实现过程,我们可以通过一个例子来加深理解。假设我们有一个包含200个数据点的数据集,每个数据点有两个输入变量x1x_1x2x_2,以及一个输出变量yy。我们可以使用二次多项式函数来拟合这些数据。

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

# 生成二元数据
np.random.seed(0)
m = 200
x = np.random.uniform(-1, 1, size=(m, 2))
y = np.sum(x**2, axis=1) + np.random.normal(0, 0.1, size=m)

# 构造齐次项矩阵
n = 2
p = 3
X = np.zeros((len(x), n * p + 1))
for i in range(len(x)):
    for j in range(n):
        for k in range(n):
            X[i, j * n + k] = x[i, j] * x[i, k]
    X[i, n*p] = 1

# 计算回归系数
w = np.dot(np.linalg.inv(np.dot(X.T, X)), np.dot(X.T, y))

# 绘制原始数据和拟合数据
x1 = np.linspace(-1, 1, num=50)
x2 = np.linspace(-1, 1, num=50)
x1, x2 = np.meshgrid(x1, x2)
h = w[0] + w[1]*x1 + w[2]*x2 + w[3]*x1**2 + w[4]*x1*x2 + w[5]*x2**2
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.scatter(x[:, 0], x[:, 1], y, c='r', marker='o')
ax.plot_surface(x1, x2, h, color='b', alpha=0.3)
ax.set_xlabel('x1')
ax.set_ylabel('x2')
ax.set_zlabel('y')
plt.show()
Python

这段代码中,我们使用Numpy随机生成了一个包含200个数据的二元数据集,其中每个输入变量x1x_1x2x_2的取值范围为[1,1][-1,1],输出变量yy由二次方程y=x12+x22y=x_1^2+x_2^2生成,同时加入一个正态噪声。接着,我们使用之前介绍的方法构造齐次项矩阵XX和计算回归系数ww。最后,我们用三维散点图表示原始数据集并绘制出拟合的曲面。

通过运行这段代码,我们可以得到以下结果:

回归系数: [ 0.04927205  0.01560422  0.01561738 -0.0122709  -0.00800058  0.01247907  0.03292066]
Python

可以看出,生成的曲面几乎与原真实的二次曲线完全吻合,说明多元多项式回归的拟合效果很好。

总结

在本文中,我们介绍了多项式回归的基本原理以及如何使用Numpy来实现多元多项式回归。通过一个实例,我们解释了如何使用Numpy生成齐次项矩阵以及计算回归系数,同时展示了拟合曲线的可视化。以此可以体现出Numpy在数据分析和科学计算领域中的良好表现和广泛应用。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程

登录

注册