论文:Locality-constrainedLinearCodingforImageClassification
代码:http://www.ifp.illinois.edu/~jyang29/LLC.htm
基础知识:该编码方式是在词袋模型(BOW)的基础上的改进
目标:使用LLC编码方式对特征编码,获得VQ编码得不到的位置信息,从而提高准确率在VQ编码的基础上的改进方法:
输入:样本的N个特征,M个聚类中心
步骤:
1,对每个特征使用KNN最近邻算法找出5个与该特征的L2距离最小的聚类中心
2,设每个特征维数为n,计算该特征的每一维与最近的5个聚类中心的L1距离矩阵,距离矩阵的尺寸为n*5
3,对距离矩阵的距离求协方差,得到5*5的距离协方差矩阵Ci
4,对距离协方差矩阵加上0.0001的正则化对角矩阵,避免无法求逆
5,由作者给出的解析解公式,求出替代VQ编码的非零系数 w = Ci\ones(5,1)
6,归一化,w = w/sum(w);
VQ编码与LLC编码的不同之处:
VQ编码向量中,只有1个系数为1,代表该特征属于该系数对应的簇,无法精确体现该特征在特征空间中的位置
LLC编码向量中,与该特征最近的5个簇的系数都不为0,较VQ编码进一步体现出该特征在特征空间中的位置
核心代码:
function [Coeff] = LLC_coding_appr(B, X, knn, beta)
if ~exist('knn', 'var') || isempty(knn),
knn = 5;
end
if ~exist('beta', 'var') || isempty(beta),
beta = 1e-4;
end
%% 初始化参数
nframe=size(X,1); % 该样本的特征个数
nbase=size(B,1); % 聚类个数
%% find k nearest neighbors 找k个最近邻
%% 求每个特征与每个聚类中心的L2距离
XX = sum(X.*X, 2);
BB = sum(B.*B, 2);
D = repmat(XX, 1, nbase)-2*X*B'+repmat(BB', nframe, 1);
IDX = zeros(nframe, knn);
%% 对每个特征按距离远近选出最近的5个聚类中心
for i = 1:nframe,
d = D(i,:);
[dummy, idx] = sort(d, 'ascend');
IDX(i, :) = idx(1:knn);
end
%% llc approximation coding LLC近似编码
%% 初始化参数
II = eye(knn, knn);
Coeff = zeros(nframe, nbase); % 该样本的每个特征按与聚类中心距离分配大小的LLC系数,只有离特征最近的5个聚类中心的LLC系数不为0
%% 求ci系数
for i=1:nframe
%% 计算特征与最近的5个聚类中心的L1距离
idx = IDX(i,:);
z = B(idx,:) - repmat(X(i,:), knn, 1); % shift ith pt to origin
%% 计算5个距离的协方差矩阵
C = z*z'; % local covariance
C = C + II*beta*trace(C); % regularlization (K>D)
%% 由ci的解析解得系数w
w = C\ones(knn,1);
w = w/sum(w); % enforce sum(w)=1
Coeff(i,idx) = w';
end