# 压缩度量是一个数学概念,例如我们采用欧氏距离作为度量方法, 对于任意的 ||xi-xj||>||f(xi)-f(xj)|| (xi 和 xj 为样本空间中的样本)
#场景 如果我们的样本点之间距离很大,数据很稀疏的情况下,这种距离很大的计算是非常消耗资源的。我们不妨将空间的样本映射的更加紧凑点,这样计算资源的消耗也比较少。
import numpy as np
a = np.array([1, 1])
b = np.array([1, 6])
#我们需要用一个矩阵将向量集中起来,我们设矩阵为A ||a-b||>||Aa-Ab||
# 如何构建一个矩阵A? 如果我们将a b 映射靠近 他们的均值向量 不就可以了? 也就是A 将a,b 靠近(a, b)的均值向量
# 我们首先构建一个假的均值向量 m =0.5 * 1/2(a + b) + 0.5 * a + nose(一点点高斯噪音) 从几何数学来看 这个点 位于 a 和 均值向量的正中间。 [a, b] = X, [m, m] = M AX = M -> A = MX^-1
X = np.array([[1, 1],
[1, 7]])
M = np.array([[1.1, 2.3],
[1.2, 2.1]])
# 有人说没必要啊 你这还求逆矩阵这不是画蛇添足吗? 是的 但是我们告诉大家度量学习数据很多是有标签的,我们在NCA方法中我们就是求得A矩阵,利用标签信息使得相同标记得数据更加得紧凑。 在我们这里多了一个限制条件就是度量得结果比原来向量的度量结果要小。
#关键是A矩阵的构成是一个很大的问题,这里我只给出了很画蛇添足的思路,但是中心思想是让数据更加紧凑,必然度量的结果会比之前小。
dist1 = np.linalg.norm(a - b)
dist2 = np.linalg.norm(M[0] - M[1])
print(dist1)
print(dist2)