附 第四章作业
Q1
题目
设有如下三类模式样本集,和,其先验概率相等,求和
解
由题意可知
先算出样本均值:
则可得总体均值:
类内离散度矩阵:
类间离散度矩阵:
具体计算我这里通过numpy计算得到:
from fractions import Fraction
import numpy as np
np.set_printoptions(formatter={'all': lambda x: str(Fraction(x).limit_denominator())})
w = np.array([
[[1, 0], [2, 0], [1, 1]],
[[-1, 0], [0, 1], [-1, 1]],
[[-1, -1], [0, -1], [0, -2]]
])
m = np.mean(w, axis=1)
m0 = np.mean(m, axis=0)
C = np.zeros((3, 2, 2))
for i in range(3):
diff = w[i] - m[i]
C[i] = np.dot(diff.T, diff)
C = (1 / 3) * C
sw = np.zeros((2, 2))
for i in range(3):
sw = np.add(sw, (1 / 3) * C[i])
print('Sw=')
print(sw)
sb = np.zeros((2, 2))
for i in range(3):
sb = np.add(sb, np.outer((m[i] - m0), (m[i] - m0)))
sb = (1 / 3) * sb
print('Sb = ')
print(sb)
Sw= [[2/9 -1/27] [-1/27 2/9]]
Sb = [[62/81 13/81] [13/81 62/81]]
Q2
题目
设有如下两类样本集,其出现概率相等:
用K-L变换,分别把特征空间维数降到二维和一维,并画出样本在该空间中的位置
解
求总体均值
平移样本到原点:
求协方差矩阵:
求特征值和特征向量:
(1) 降到二维
取前两大的特征值对应的特征向量组成转换矩阵:
则可以得到降维后的:
则绘制出图片:

(2) 降到一维
同理,取第一大的特征值对应的特征向量作为转换矩阵,即可得到将为结果:

代码
from fractions import Fraction
import numpy as np
from matplotlib import pyplot as plt
np.set_printoptions(formatter={'all': lambda x: str(Fraction(x).limit_denominator())})
x = np.array([
[[0, 0, 0], [1, 0, 0], [1, 0, 1], [1, 1, 0]],
[[0, 0, 1], [0, 1, 0], [0, 1, 1], [1, 1, 1]]
])
p = np.array([1 / 2, 1 / 2])
m = np.mean(x, axis=1)
m0 = np.zeros(3)
for i in range(2):
m0 = np.add(m0, m[i] * p[i])
z = x - m0
R = np.zeros((3, 3))
for i in range(z.shape[0]):
R += p[i] * np.mean(np.einsum('ij,ik->ijk', z[i], z[i]), axis=0)
eig_val, eig_vec = np.linalg.eig(R)
sort_indices = np.argsort(-eig_val)
eig_val = eig_val[sort_indices]
eig_vec = eig_vec[sort_indices, :]
# 降到2维
transform = eig_vec[:2].T
y = np.dot(z, transform)
class1_data = y[0]
class2_data = y[1]
plt.scatter(class1_data[:, 0], class1_data[:, 1], marker='^', color='red', alpha=0.5, label='class 1')
plt.scatter(class2_data[:, 0], class2_data[:, 1], marker='o', color='blue', alpha=0.5, label='class 2')
plt.title('KL Transformation 2D')
plt.legend()
plt.show()
# 降到1维
transform = eig_vec[:1].T
y = np.dot(z, transform)
class1_data = y[0]
class2_data = y[1]
plt.scatter(class1_data, np.zeros_like(class1_data), marker='^', color='red', alpha=0.5, label='class 1')
plt.scatter(class2_data, np.zeros_like(class2_data), marker='o', color='blue', alpha=0.5, label='class 2')
plt.title('KL Transformation 1D')
plt.legend()
plt.show()
最后更新于
这有帮助吗?