Menu

模式识别·实验(一)

实验题目

下面的几道题可能会用到如下的程序:

  • 写一个程序产生服从$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]

以下是它的判别值。

1
-3.0790971643993297

$\vec{x}$到$\vec{\mu}$的欧氏距离。

1
1.5755761473124579

$\vec{x}$到$\vec{\mu}$的马氏距离。

1
2.482440195979968

实验总结

本次实验主要实现了贝叶斯决策论的一些基本函数,由于大部分的内容在 Python 的矩阵运算库 numpy 里都有了,因此还是相对比较简单的。