近来课程上做了一个PCA生成特征脸的小工程,刚好实验室科研做不下去了就放松下写个博客梳理下吧,由于是用了KL变换,所以撒呼呼地去找背景知识科普时翻查了些KL散度的知识点,后来发现好像和KL变换关系不大orz(小声BB,也许是我太水,看不出二者关联2333)
KL散度
-
K-L散度
,是一种量化两种概率分布P和Q之间差异的方式,又叫相对熵
。在概率学和统计学上,我们经常会使用一种更简单的、近似的分布
来替代观察数据
或太复杂的分布
。K-L散度能帮助我们度量使用一个分布来近似另一个分布时所损失的信息量。” -
交叉熵
![](https://i-blog.csdnimg.cn/blog_migrate/3bbf8e5e9e99930f50fc8867fc60becf.png)
-
KL散度(相对熵)
-
KL散度和交叉熵的关系:
DKL(p||q) = H(p, q) - H(p)
在神经网络的训练阶段,用交叉熵作为 cost function,而不选用KL散度作为 cost function的原因是,
H(p)
是常数值,所以minimizing the cross-entropy between the data distribution and the model distribution gives the same results as minimizing KL-divergence.
KL变换
- PCA算法(KL变换)
![](https://i-blog.csdnimg.cn/blog_migrate/a67a39222bdc888c0222a6bcf9dd432d.png)
- KL变换应用 - 人脸识别
- 把每一幅人脸图片列化,假设一共M张人脸图片,每张人脸N维,最后组成,N x M维的矩阵 F
- 估计F协方差矩阵C,并计算其特征值特征向量。
(C为半正定矩阵,维数不大于图像数,对应不同特征值的特征向量正交,特征脸) - 选择对应少量最大特征值的特征向量组成特征脸空间
- 每张脸映射为特征脸空间的点,以其坐标作为特征向量。
- 采用模式识别方法,进行分类识别。(如欧式距离)
- 生成人脸图片数据集的 top k 特征脸空间的matlab代码片段示例
%% PCA函数
% params: data: N * M 维的原始图片集矩阵F;
% img_num: 人脸图片的数目;
% eigenface: 用于存储 topk 特征脸空间 k * 112 * 92
function eigenface = pca_face(data, img_num, eigenface)
data_mean = data - mean(data, 2); % 每一行进行零均值化
C = 1 / img_num * data_mean * data_mean.'; % 求得协方差矩阵
[V, D] = eig(C); % 求特征值和特征向量
[d,ind] = sort(diag(D), 'descend'); % 将特征值按降序排序
Vs = V(:,ind); % 前k列为前k大的特征值所对应的特征向量
for i = 1 : size(eigenface, 3)
eigenface(:,:,i) = reshape(Vs(:, i), 112, 92); % 显示的特征脸图片尺寸为 112 * 92
end
end
附上一张生成的 top8 特征脸空间图例:
![](https://i-blog.csdnimg.cn/blog_migrate/f35785de47b41f453fa917d502c82750.png)