如果这篇博客帮助到你,可以请我喝一杯咖啡~
CC BY 4.0 (除特别声明或转载文章外)
实验题目
下面的几道题可能会用到如下的程序:
- 写一个程序产生服从$d$维正态分布$N(\vec{\mu},\Sigma)$的随机样本
- 写一个程序计算一给定正态分布及先验概率$P(\omega_i)$的判别函数(式(49)中所给的形式)。
- 写一个程序计算任意两个点间的欧式距离。
- 在给定协方差矩阵$\Sigma$的情况条件下,写一个程序计算任意一点$\vec{x}$到均值$\vec{\mu}$间的 Mahalanobis 距离。
实验过程及代码
# 生成多维正态分布
# 使用numpy中的multivariate_normal
import numpy
mu=numpy.array([1, 5])
sigma=numpy.array([[1,0],[0,1]])
x = numpy.random.multivariate_normal(mu,sigma)
print(x)
# 计算给定正态分布和先验概率P(w)的判别函数
def discriminant(x,mu,sigma,Pw):
d = mu.size
return -1/2 *manhalanobis(x,mu,sigma) - d/2 * numpy.log(numpy.pi) - 1/2 * numpy.log(numpy.abs(numpy.linalg.det(sigma))) + numpy.log(Pw)
print(discriminant(x,mu,sigma,1/2))
# 计算两个点x和mu之间的欧氏距离
# 直接向量作差后取norm
print(numpy.linalg.norm(x-mu))
# 给定协方差矩阵sigma,计算x和mu之间的马氏距离
def manhalanobis(x,mu,sigma):
return (x-mu).T.dot(numpy.linalg.inv(sigma)).dot((x-mu))
print(manhalanobis(x,mu,sigma))
实验结果及分析
以下为根据分布随机生成的二维向量:
[-0.38358186 5.75375157]
以下是它的判别值。
-3.0790971643993297
$\vec{x}$到$\vec{\mu}$的欧氏距离。
1.5755761473124579
$\vec{x}$到$\vec{\mu}$的马氏距离。
2.482440195979968
实验总结
本次实验主要实现了贝叶斯决策论的一些基本函数,由于大部分的内容在 Python 的矩阵运算库 numpy 里都有了,因此还是相对比较简单的。