2.2 模型选择

模型的建立主要有两个步骤:第一,选择适合的模型;第二,根据数据不断优化模型,使其与原始数据越来越相似。本章节着重介绍基础模型,阐述模型的一般使用场景与使用差异。

一、线性模型(Linear Model)

线性模型是通过一个或多个自变量来预测因变量,简单而言就是用多个x(输入)来预测一个y(输出),可以简单写成以下形式:

y=β0+β1x1+β2x2++βpxp+ϵy = \beta_0 + \beta_1x_1 + \beta_2x_2 + \cdots + \beta_px_p + \epsilon

其中y代表因变量,β0代表截距项,β1、β2等代表系数(coefficients),x1、x2等代表自变量。ϵ代表误差项,通常假设其服从均值为0的高斯分布。

示例:通过城市人口来预测当地房价。

图2.2.1 房价与人口的线性关系图

这样的一元线性关系可以用以下数学形式表达:

y=ax+by = a x + b

其中,y是当地房价,x是城市人口,a和b都是需要拟合的参数。

假设我们设置a=0.5,b=3,即y=0.5x+3。这是用于生成模拟数据的真模型,在一般的应用场景下,这是未知的,在理想状态下通过原始数据建立起的拟合模型应该最大限度接近等于真模型。

import numpy as np
import matplotlib.pyplot as plt

a = 0.5 # coefficient
b = 3   # intercept
noiseVar = 2 # 高斯noise的标准差
x = np.arange(1, 100, 1) # x为1到100的整数

# generate data
y =  a * x + b + noiseVar * np.random.randn(x.size) # 在生成过程中加入高斯noise

通过上述代码,我们得到了100个相应的数据点。我们现在通过代码将得到的模拟数据和真模型绘制出来。

plt.plot(x, y, 'o', color='r', label='Data') # plot data
plt.plot(x, a*x+b, '-', color='k', label='True model') # plot tru model
plt.xlabel('Population (1000 ppl)')
plt.ylabel('House price (k yuan)')
plt.legend(fontsize=14)
plt.title('Linear model')

会得到如下图像:

图2.2.2 线性模型模拟结果

若模型表达式变成了这样:

y=β0+β1x+β2x2+β3x3++βnxn+ϵy = \beta_0 + \beta_1 x + \beta_2 x^2 + \beta_3 x^3 + \cdots + \beta_n x^n + \epsilon

其中,y表示因变量,x表示自变量,β表示系数,ϵ是误差项。

在此基础上,可以尝试将其改写为类似于线性模型的形式,即:

y=w0+w1x1+w2x2++wpxp+ϵy = w_0 + w_1 x_1 + w_2 x_2 + \cdots + w_p x_p + \epsilon

其中:

w1=β1,w2=β2x,w3=β3x2w_1 = \beta_1, w_2 = \beta_2 x,w_3 = \beta_3 x^2

虽然这个模型可以用类似线性模型的方式书写表达式,但其本质上属于非线性模型。

示例:同样用当地人口预测城市房价,假设城市房价与当地人口存在以下关系:

y=ax2+bx+cy = ax^2 + bx + c

假设a = 0.5,b = 3,c = 5,生成模拟数据:

import numpy as np
import matplotlib.pyplot as plt

# Here We create data
a = 0.5 # coefficient1
b = 3   # coefficient1
c = 5   # intercept
noiseVar = 500 # noise的程度,增加了噪声大小以便观察
x = np.arange(-50, 100, 1)
# generate data
y =  a * x**2 + b*x + c + noiseVar * np.random.randn(x.size)

由此我们获得了150个数据点,接下来我们绘制图像:

plt.plot(x, y, 'o', color='r', label='Data') # plot data
plt.plot(x, a * x**2 + b*x + c, '-', color='k', label='True model') # plot tru model
plt.xlabel('Population (1000 ppl)')
plt.ylabel('House price (k yuan)')
plt.legend(fontsize=14)
plt.title('Linearized model')

随后我们可以得到如下图像:

图2.2.3 线性化模型模拟结果

二、非线性模型(Nonlinear Model)

用于描述因变量与一个或多个自变量之间的关系,但是因变量与自变量之间无法写作线性组合的形式。其数学表达式一般写作:

y=f(x1,x2,,xp)+ϵy = f(x_1, x_2, \ldots, x_p) + \epsilon

其中,y为因变量,x1, x2等为自变量,f是一个非线性函数,ϵ是误差项。

示例:同样用当地人口预测城市房价,假设城市房价与当地人口存在以下关系:

y=log(x)y = \log(x)

其中y是当地房价,x是当前城市人口。我们通过如下代码来模拟数据:

import numpy as np
import matplotlib.pyplot as plt

# Here We create data
noiseVar = 1 # noise的程度
x = np.arange(0.01, 3, 0.01)
# generate data
y =  np.log(x) + noiseVar* np.random.randn(x.size)

我们同样得到了一系列数据点,随后我们绘制图像来直观显示模拟的结果:

plt.plot(x, y, 'o', color='r', label='Data') # plot data
plt.plot(x, np.log(x), '-', color='k', label='True model') # plot tru model
plt.xlabel('Population (1000 ppl)')
plt.ylabel('House price (k yuan)')
plt.legend(fontsize=14)
plt.title('Nonlinear model')

随后我们可以得到如下的图像:

图2.2.4 非线性模型的模拟结果

三、模型之间的差异

线性与非线性模型之间存在一定差异,主要差异如下:

1、线性模型和线性化模型可以写作矩阵形式,而非线性模型一般不行。线性模型和线性化模型都可以写作如下的矩阵形式:

y=WX+ϵy = WX + \epsilon

其中y是因变量,W是参数的矩阵,X是自变量的矩阵,ϵ表示误差项。可以写成矩阵形式在表达、计算和存储等方面有诸多便利。而非线性模型则无法写成矩阵形式。

2、线性模型较为简单,在优化过程中可能存在已从数学上证明的解析解法,我们也可以通过诸如最小二乘法等简单方法来计算最优参数结果。但非线性模型一般较为复杂,我们通常使用数值估计的方法来优化,比如最大似然估计(MLE)等。

最后更新于