def llc(X, D, knn=5):
# the sparse coder introduced in
# "Locality-constrained Linear Coding for Image Classification"
n_samples = X.shape[1]
n_atoms = D.shape[1]
# has the distance of
# each sample to each atom
dist = np.zeros((n_samples, n_atoms))
# calculate the distances
for i in range(n_samples):
for j in range(n_atoms):
dist[i, j] = norm(X[:, i] - D[:, j])
# has the indices of the atoms
# that are nearest neighbour to each sample
knn_idx = np.zeros((n_samples, knn)).astype(int)
for i in xrange(n_samples):
knn_idx[i, :] = np.argsort(dist[i, :])[:knn]
# the sparse coding matrix
Z = np.zeros((n_atoms, n_samples))
II = np.eye(knn)
beta = 1e-4
b = np.ones(knn)
for i in xrange(n_samples):
idx = knn_idx[i, :]
z = D.T[idx, :] - repmat(X.T[i, :], knn, 1)
C = np.dot(z, z.T)
C = C + II * beta * np.trace(C)
# solve the linear system C*c=b
c = solve(C, b)
# enforce the constraint on the sparse codes
# such that sum(c)=1
c = c / float(np.sum(c))
Z[idx, i] = c
return Z
评论列表
文章目录