> For the complete documentation index, see [llms.txt](https://ruyuanzhang.gitbook.io/compmodcogpsy/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://ruyuanzhang.gitbook.io/compmodcogpsy/di-er-zhang-ji-suan-mo-xing-ji-chu/2.2-mo-xing-xuan-ze.md).

# 2.2 模型选择

当我们谈论一个计算问题的时候，我们到底应该选择怎么样的模型呢？

我们思考这样一个问题，假定我们现在想知道中国的某个城市的房价和其人口之间的关系。按照我们的常识，通常认为越发达的大城市(例如北京、上海)，其房价肯定相对更高。我们当然可以用“人口越多房价越高”这样一句简单的语言来描述，进一步的，我们到底选用怎样的定量模型来捕捉这一现象呢？我们不妨首先来考虑最简单的线性模型。

## 线性模型（Linear Model）

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

$$
y = \beta\_0 + \beta\_1x\_1 + \beta\_2x\_2 + \cdots + \beta\_px\_p + \epsilon  \qquad (2.1)
$$

其中$$y$$代表因变量(这里是房价)，$$β\_0$$代表截距项，$$β\_1$$、$$β\_0$$等代表系数（coefficients），$$x\_1$$、$$x\_2$$等代表自变量(可以是人口、GDP、面积等各个因素)。$$\epsilon$$代表误差项，通常假设其服从均值为0的高斯分布。

让我们来看一个粗略的例子，下面这个图展示了我国一个大概的放假随着人口增长的趋势图(只供示例，数据并不精准)

<figure><img src="/files/ZE9JJzFelFn6KatbtEP3" alt=""><figcaption><p>图2.2.1 房价与人口的线性关系图</p></figcaption></figure>

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

$$
y = a x + b \qquad(2.2)
$$

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

假设我们设置$$a=0.5$$，$$b=3$$，即$$y=0.5x+3$$。这是用于生成模拟数据的真模型。

{% hint style="info" %}
注意，在这本书中，我们经常用“真模型”来代表我们假定已经知道该模型的参数值，不需要估计，而这么做的目的往往是为了产生模拟数据，是所见数据背后的模型。
{% endhint %}

我们先来产生一部分数据:

{% code overflow="wrap" expandable="true" %}

```python
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
```

{% endcode %}

> 这里的 `np.random.randn(x.size)` 代表的是产生以0为均值，1为标准差的`x.size`个随机数，前面乘以`noiseVar`将这些随机数扩展到以`noiseVar`为标准差的随机数

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

```python
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')
```

会得到如下图像：

<figure><img src="/files/fKNNwC0G6FvqWGVvQbcb" alt=""><figcaption><p>图2.2.2 线性模型模拟结果</p></figcaption></figure>

## 非线性模型

可是人口和放假的关系往往没有那么直接，也可能是非线性关系。例如：同样用当地人口预测城市房价，假设城市房价与当地人口存在以下关系：

$$
y = ax^2 + bx + c \qquad (2.3)
$$

可以看到，在这个例子中，相比于公式(2.2)，多加了一个$$ax^2$$这个人口因素的二次项。但是看上去，我们还可以把其当做类似于 $$y=\beta\_1*x\_1 + \beta\_2*x\_2 +\beta\_0$$ 这样的线性形式。严格意义上来说它不是线性模型，我们就暂且称之为线性化模型(linearized model)。

假定真模型的$$a = 0.5$$，$$b = 3$$，$$c = 5$$，我们可以同样生成模拟数据：

```python
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)
# add gaussian noise and generate data
y =  a * x**2 + b*x + c + noiseVar * np.random.randn(x.size)
```

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

```python
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')
```

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

<figure><img src="/files/GAgGhI0HdHCv5wDkPRVu" alt=""><figcaption><p>图2.2.3 线性化模型模拟结果</p></figcaption></figure>

以上的例子其实已经涉及到了非线性模型。对于非线性模型来说，其数学表达式一般写作：

$$
y = f(x\_1, x\_2, \ldots, x\_p) + \epsilon
$$

其中，$$y$$为因变量，$$x\_1$$, $$x\_2$$等为各个自变量，$$f$$是一个非线性函数，$$ϵ$$是误差项。

同样用当地人口预测城市房价，假设城市房价与当地人口存在以下关系：

$$
y = \log(x)
$$

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

<pre class="language-python"><code class="lang-python">import numpy as np
import matplotlib.pyplot as plt

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

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

```python
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')
```

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

<figure><img src="/files/5FPjoAZZiJjL19yi9te7" alt=""><figcaption><p>图2.2.4 非线性模型的模拟结果</p></figcaption></figure>

可见，某种程度上来说，也许一个城市的平均房价不会随着人口的增加而无限制地增长下去，同样受到很多别的因素的影响，而上面的模型刚好能抓住这种现象。

### 模型之间的差异

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

* 如果你学过线性代数，你一定会明白线性模型和线性化模型可以写作矩阵形式，而非线性模型一般不行。线性模型和线性化模型都可以写作矩阵形式$$y = WX + \epsilon$$。其中y是因变量，W是参数的矩阵，X是自变量的矩阵，ϵ表示误差项。可以写成矩阵形式在表达、计算和存储等方面有诸多便利。而非线性模型则无法写成矩阵形式。
* 线性模型较为简单，在优化过程中可能存在已从数学上证明的解析解法，我们也可以通过诸如最小二乘法等简单方法来计算最优参数结果。但非线性模型一般较为复杂，我们通常使用数值估计的方法来优化，比如最大似然估计(maximum likelihood estimation, MLE)等，这一部分会在下一节内容介绍。
