post on
    29 Sep 2019
    
    
    about
    1047words
    
    
    require
    4min
    
    
    
  CC BY 4.0
(除特别声明或转载文章外)
如果这些文字帮助到你,可以请我喝一杯咖啡~
  
  实验题目
下面的几道题可能会用到如下的程序:
  - 写一个程序产生服从$d$维正态分布$N(\vec{\mu},\Sigma)$的随机样本
 
  - 写一个程序计算一给定正态分布及先验概率$P(\omega_i)$的判别函数(式(49)中所给的形式)。
 
  - 写一个程序计算任意两个点间的欧式距离。
 
  - 在给定协方差矩阵$\Sigma$的情况条件下,写一个程序计算任意一点$\vec{x}$到均值$\vec{\mu}$间的 Mahalanobis 距离。
 
实验过程及代码
1
2
3
4
5
6
7
  | # 生成多维正态分布
# 使用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)
  | 
 
1
2
3
4
5
  | # 计算给定正态分布和先验概率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))
 | 
 
1
2
3
  | # 计算两个点x和mu之间的欧氏距离
# 直接向量作差后取norm
print(numpy.linalg.norm(x-mu))
  | 
 
1
2
3
4
  | # 给定协方差矩阵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))
 | 
 
实验结果及分析
以下为根据分布随机生成的二维向量:
1
  | [-0.38358186  5.75375157]
  | 
 
以下是它的判别值。
$\vec{x}$到$\vec{\mu}$的欧氏距离。
$\vec{x}$到$\vec{\mu}$的马氏距离。
实验总结
本次实验主要实现了贝叶斯决策论的一些基本函数,由于大部分的内容在 Python 的矩阵运算库 numpy 里都有了,因此还是相对比较简单的。
 
  Loading comments...