附 第四章作业
Q1
题目
设有如下三类模式样本集ω1,ω2和ω3,其先验概率相等,求Sw和Sb
ω1:{(1 0)T,(2 0)T,(1 1)T}ω2:{(−1 0)T,(0 1)T,(−1 1)T}ω3:{(−1 −1)T,(0 −1)T,(0 −2)T}
解
由题意可知
P(ω1)=P(ω2)=P(ω3)=31
先算出样本均值:
m1=(34 31)Tm2=(−32 32)Tm3=(−31 −34)T
则可得总体均值:
m0=E{x}=j=1∑3P(ωi)mi=(91 −91)T
类内离散度矩阵:
Sw=i=1∑3P(ωi)E{(x−mi)(x−mi)T∣ωi}=i=1∑3P(ωi)N1k=1∑Ni(xik−mi)(kik−mi)T=31(92−91−9192)+31(92919192)+31(92−91−9192)
类间离散度矩阵:
Sb=i=1∑cP(ωi)(mi−m0)(mi−m0)T
具体计算我这里通过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
题目
设有如下两类样本集,其出现概率相等:
ω1:{(0 0 0)T,(1 0 0)T,(1 0 1)T,(1 1 0)T}ω2:{(0 0 1)T,(0 1 0)T,(0 1 1)T,(1 1 1)T}
用K-L变换,分别把特征空间维数降到二维和一维,并画出样本在该空间中的位置
解
求总体均值
m=E{x}=0.5×41j=1∑4x1j+0.5×41j=1∑4x2j=(21 21 21)T
平移样本到原点:
z=x−m
求协方差矩阵:
R=i=1∑2P(ωi)E(zi ziT)=i=1∑2P(ωi)N1j=1∑N(zij zijT)=21[41j=1∑4z1jz1jT]+21[41j=1∑4z2jz2jT]=410004100041
求特征值和特征向量:
λ1=λ2=λ3=41ϕ1=100ϕ2=010ϕ3=001
(1) 降到二维
取前两大的特征值对应的特征向量组成转换矩阵:
Φ=100010
则可以得到降维后的y=ΦTx:
ω1:{(−21 −21)T,(21 −21)T,(21 −21)T,(21 21)T}ω2:{(−21 −21)T,(−21 21)T,(−21 21)T,(21 21)T}
则绘制出图片:
(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()
最后更新于
这有帮助吗?