## 图文详解高斯过程（一）——含代码

2017 年 12 月 18 日 论智 Alex Bridgland

## 什么是高斯过程？

• 假设有一个隐藏函数：f：ℝ→ℝ，我们要对它建模；

• fx

## 用高斯建模函数

GP背后的关键思想是可以使用无限维多变量高斯分布来对函数进行建模。换句话说，输入空间中的每个点都与一个随机变量相关联，而它们的联合分布可以被作为多元高斯分布建模。

1. def plot_unit_gaussian_samples(D):

2.    p = figure(plot_width=800, plot_height=500,

3.               title='Samples from a unit {}D Gaussian'.format(D))

4.    xs = np.linspace(0, 1, D)

5.    for color in Category10[10]:

6.        ys = np.random.multivariate_normal(np.zeros(D), np.eye(D))

7.        p.line(xs, ys, line_width=1, color=color)

8.    return p

9. show(plot_unit_gaussian_samples(2))

1. show(plot_unit_gaussian_samples(20))

## 用核函数实现平滑

1. def k(xs, ys, sigma=1, l=1):

2.    """Sqared Exponential kernel as above but designed to return the whole

3.    covariance matrix - i.e. the pairwise covariance of the vectors xs & ys.

4.    Also with two parameters which are discussed at the end."""

5.    # Pairwise difference matrix.

6.    dx = np.expand_dims(xs, 1) - np.expand_dims(ys, 0)

7.    return (sigma ** 2) * np.exp(-((dx / l) ** 2) / 2)

8. def m(x):

9.    """The mean function. As discussed, we can let the mean always be zero."""

10.    return np.zeros_like(x)

1. N = 100

2. x = np.linspace(-2, 2, N)

3. y = np.linspace(-2, 2, N)

4. d = k(x, y)

5. color_mapper = LinearColorMapper(palette="Plasma256", low=0, high=1)

6. p = figure(plot_width=400, plot_height=400, x_range=(-2, 2), y_range=(-2, 2),

7.           title='Visualisation of k(x, x\')', x_axis_label='x',

8.           y_axis_label='x\'', toolbar_location=None)

9. p.image(image=[d], color_mapper=color_mapper, x=-2, y=-2, dw=4, dh=4)

10. color_bar = ColorBar(color_mapper=color_mapper, ticker=BasicTicker(),

11.                     label_standoff=12, border_line_color=None, location=(0,0))

13. show(p)

1. p = figure(plot_width=800, plot_height=500)

2. D = 20

3. xs = np.linspace(0, 1, D)

4. for color in Category10[10]:

5.    ys = np.random.multivariate_normal(m(xs), k(xs, xs))

6.    p.circle(xs, ys, size=3, color=color)

7.    p.line(xs, ys, line_width=1, color=color)

8. show(p)

1. n = 100

2. xs = np.linspace(-5, 5, n)

3. K = k(xs, xs)

4. mu = m(xs)

5. p = figure(plot_width=800, plot_height=500)

6. for color in Category10[5]:

7.    ys = np.random.multivariate_normal(mu, K)

8.    p.line(xs, ys, line_width=2, color=color)

9. show(p)

## 用先验和观察进行预测

1. # coefs[i] is the coefficient of x^i

2. coefs = [6, -2.5, -2.4, -0.1, 0.2, 0.03]

3. def f(x):

4.    total = 0

5.    for exp, coef in enumerate(coefs):

6.        total += coef * (x ** exp)

8. xs = np.linspace(-5.0, 3.5, 100)

9. ys = f(xs)

10. p = figure(plot_width=800, plot_height=400, x_axis_label='x',

11.           y_axis_label='f(x)', title='The hidden function f(x)')

12. p.line(xs, ys, line_width=2)

13. show(p)

K=κ(x,x)，均值函数m(x)=0。

1. x_obs = np.array([-4, -1.5, 0, 1.5, 2.5, 2.7])

2. y_obs = f(x_obs)

3. x_s = np.linspace(-8, 7, 80)

1. K = k(x_obs, x_obs)

2. K_s = k(x_obs, x_s)

3. K_ss = k(x_s, x_s)

4. K_sTKinv = np.matmul(K_s.T, np.linalg.pinv(K))

5. mu_s = m(x_s) + np.matmul(K_sTKinv, y_obs - m(x_obs))

6. Sigma_s = K_ss - np.matmul(K_sTKinv, K_s)

1. p = figure(plot_width=800, plot_height=600, y_range=(-7, 8))

2. y_true = f(x_s)

3. p.line(x_s, y_true, line_width=3, color='black', alpha=0.4,

4.       line_dash='dashed', legend='True f(x)')

5. p.cross(x_obs, y_obs, size=20, legend='Training data')

6. stds = np.sqrt(Sigma_s.diagonal())

7. err_xs = np.concatenate((x_s, np.flip(x_s, 0)))

8. err_ys = np.concatenate((mu_s + 2 * stds, np.flip(mu_s - 2 * stds, 0)))

9. p.patch(err_xs, err_ys, alpha=0.2, line_width=0, color='grey',

10.        legend='Uncertainty')

11. for color in Category10[3]:

12.    y_s = np.random.multivariate_normal(mu_s, Sigma_s)

13.    p.line(x_s, y_s, line_width=1, color=color)

14. p.line(x_s, mu_s, line_width=3, color='blue', alpha=0.4, legend='Mean')

15. show(p)

## 下篇预告

Github：gist.github.com/Bridgo/429594942ff51037ecc703905e40c562

### 相关内容

17+阅读 · 2019年10月18日
AI研习社
7+阅读 · 2019年3月1日

10+阅读 · 2019年2月13日

8+阅读 · 2019年2月11日

8+阅读 · 2018年7月8日

7+阅读 · 2018年5月10日

10+阅读 · 2018年1月18日

35+阅读 · 2020年7月4日

55+阅读 · 2020年6月6日

163+阅读 · 2020年6月3日

112+阅读 · 2020年6月3日

63+阅读 · 2020年5月9日

130+阅读 · 2020年5月2日

13+阅读 · 2020年4月20日

88+阅读 · 2020年3月15日

Pasquale Minervini,Matko Bošnjak,Tim Rocktäschel,Sebastian Riedel,Edward Grefenstette
10+阅读 · 2019年12月17日
7+阅读 · 2019年9月10日
Jingzhao Zhang,Lu Mi,Macheng Shen
6+阅读 · 2018年12月13日
Yen-Yu Chang,Fan-Yun Sun,Yueh-Hua Wu,Shou-De Lin
11+阅读 · 2018年9月6日
Badri N. Patro,Vinod K. Kurmi,Sandeep Kumar,Vinay P. Namboodiri
6+阅读 · 2018年6月15日
Ziwei Zhang,Peng Cui,Haoyang Li,Xiao Wang,Wenwu Zhu
4+阅读 · 2018年5月7日
Honggang Zhou,Yunchun Li,Hailong Yang,Wei Li,Jie Jia
3+阅读 · 2018年4月26日
Ermo Wei,Drew Wicke,David Freelan,Sean Luke
10+阅读 · 2018年4月25日
Ngoc-Trung Tran,Tuan-Anh Bui,Ngai-Man Cheung
10+阅读 · 2018年3月23日
Liqian Ma,Qianru Sun,Stamatios Georgoulis,Luc Van Gool,Bernt Schiele,Mario Fritz
6+阅读 · 2018年1月21日
Top