https://www.youtube.com/watch?v=4vGiHC35j9s
numpy中expand_dims()函数详解_塔塔的守护者的博客-CSDN博客_expand_dims
补充:何为先验何为后验
作者:昌硕
链接:https://zhuanlan.zhihu.com/p/26464206
为了很好的说明这个问题,在这里举一个例子:
玩英雄联盟占到中国总人口的60%,不玩英雄联盟的人数占到40%:
为了便于数学叙述,这里我们用变量X来表示取值情况,根据概率的定义以及加法原则,我们可以写出如下表达式:
P(X=玩lol)=0.6;P(X=不玩lol)=0.4,这个概率是统计得到的,或者你自身依据经验给出的一个概率值,我们称其为先验概率(prior probability);
另外玩lol中80%是男性,20%是小姐姐,不玩lol中20%是男性,80%是小姐姐,这里我用离散变量Y表示性别取值,同时写出相应的条件概率分布:
P(Y=男性|X=玩lol)=0.8,P(Y=小姐姐|X=玩lol)=0.2
P(Y=男性|X=不玩lol)=0.2,P(Y=小姐姐|X=不玩lol)=0.8
那么我想问在已知玩家为男性的情况下,他是lol玩家的概率是多少:
依据贝叶斯准则可得:
P(X=玩lol|Y=男性)=P(Y=男性|X=玩lol)*P(X=玩lol)/
[ P(Y=男性|X=玩lol)*P(X=玩lol)+P(Y=男性|X=不玩lol)*P(X=不玩lol)]
最后算出的P(X=玩lol|Y=男性)称之为X的后验概率,即它获得是在观察到事件Y发生后得到的
Introduction:
假设我们有这么两个高斯分布,, 的均值为0,也就是期望值为0。假设他们是正态分布,那么对角线。对于右上角的元素应该是0(无线性关联)因为增加,跟随着无法确定单独增加还是减少,因为对应的点有正也有负。因此。
对于这一个分布,我们可以清楚地看到增加,也会相应增加并且是正的,所以协方差左下右上这两块也会是正的。
从联合分布到条件分布:
假设我们已经知道描述这个红色bell的各个参数,如均值和协方差矩阵,在处切一刀(图上是错误的,老师画成了),求给定的分布下的和, 公式如上图所示,下图是一般通用公式,是拓展到向量的,而不是单单一个值
电脑中的取样方法/转换标准正态分布:
左边的图:下面是正态分布概率密度函数,左上角是概率积分,右边是0-1均匀分布。在均匀分布上取一点投影到积分函数的y,对应的x投影到高斯分布。结局取点就会集中在期望附近。
将高维度高斯转换到标准正态分布要用到Cholesky方法。具体如图所示。
Regression in Gaussian:
已知(是这三个元素组成向量还是个个都是高维度向量?我偏向于这个解释,但是老师又说他们是1维。。接着看吧,看到后面觉得应该这三个就是一维的)的高维高斯以及某个函数的函数值,要学习这种分布,为了简便设均值为0,然后协方差矩阵的参数由之间的距离来衡量,距离越近相关性越大。
我们构造这个分布是用来做预测的,如下图所示:
假设我们已经有Dataset D,里面已经知道,我们通过上一张图建立了~,我们假设这新的的函数值也属于正态分布。依照我们之前的理论,把它append进这个组成新向量,根据上述学到的公式,在知道的情况下,
就可以求出来,具体就是确定,得到的期望值以及它的波动情况。
根据上面的预测方法,我们现在可以知道,依据现有的数据⭕,如果新加入了一个点●,它的函数值的期望大小与区间就能被确定,并且可以看出,根据算法,在之间的那个新点的区间很小说明预测的会比较靠谱,越是远离数据的预测区间越大,也就是越不靠谱,换种说法就是没有数据的地方我们不能做自信的预测。
Gaussian Process是函数的分布。如何创建一个简单的可视化分布呢
第一步:创建大向量
第二步:假定μ是0矩阵,用圈起来的公式计算出N*N kernel matrix
第三步:做Cholesky 拆出标准差
第四步:对每个x点都进行一个正态分布生成,用L转换到函数分布下
实现代码如下:
import numpy as np
import matplotlib.pyplot as plt
def kernel(a, b):
# a**2 会把 a所有元素平方,sum函数加个1让a变为nx1,再reshape成列向量
sqdist = np.sum(a**2, 1).reshape(-1, 1) + np.sum(b**2, 1) - 2 * np.dot(a, b.T)
return np.exp(-.5 * sqdist)
n = 50
X_test = np.linspace(-5, 5, n).reshape(-1, 1)
print("X_text is ", X_test)
K_ = kernel(X_test, X_test)
print("kernel is ", K_)
L = np.linalg.cholesky(K_ + 1e-6*np.eye(n))
print("append term is ", 1e-6*np.eye(n))
f_prior = np.dot(L, np.random.normal(size=(n, 10))) # 10表示一个点取10个
plt.plot(X_test, f_prior)
plt.show()
这段代码产生的函数如左图,很乱,但是你有数据的时候就可以用数据构建函数分布,用构建的那个分布来扩张你的kernel,那么生成的函数就会有一定约束一样,越靠近数据,variance 就会越低
我们用定义的这个核来进行映射,首先先用得到的数据构建,然后append 得到新的期望与核,然后以此获得该点对应的均值与方差。
Recap in Lecture 2
参数L的作用:
对于参数l来说,随着l的增长,两个x点的距离差结果就会减小,exp函数增大,于是相邻点的相关性增强(指数函数结果接近1),图里的点与点之间就会出现最右图的取值区间很窄的情况。这个l的意义就是effect-kernel-width,数字越大kernel的width越高
选择这些参数的方法可以用cross-validation。
Things about dealing with noise:
y是一个带噪声的函数,去求的话,我们要利用类似以下公式的原理来边缘化
第一眼看到这个公式是有点懵逼的,但是仔细一想,如果和是一一对应的,那么自然
的值就为1,那么根据边缘概率公式对积分的话那自然就会有。
对于这里的 ,产生X的函数是正态分布来的所以概率这么表达,对于(这个表达下面那个就是这个值确定的情况), 产生观测值的几率就是符合正态分布,期望值是, 方差是噪声方差。有n个点就连乘n下。
根据协方差公式,新的协方差增大了,在对角线上增加了的噪声项,除了这个以外其他的预测准则仍然与原来不变。问题来了,我之前一直不知道为啥设置均值为0,观察预测规则以后发现预测的数值仅仅与y和协方差的项有关,只需要原来数据对应的(计算),以及新来的(计算)便可以进行预测。
得到的结果如图所示,现在有数据的地方也有uncertainty的存在了。
Learning kernel parameter:
通过极大似然估计,然后对所要求的参数求导,通过梯度下降法就可以得出需要的那个参数l
从另一个角度进行推论:是一个常数。是由需要预测的点和旧的点组成的相关度向量, 的来源是training。从上面这个求和的式子可以看出,GP过程就是在用一堆的basic function(指数函数),通过学习它们的权重,来approximate一个non-linear function。这就很符合我们对机器学习的直觉。
Noisy GP regression and Ridge:
没仔细听,以后有用到再说吧, 暂时写到这,后续写贝叶斯优化/GP后续