【问题标题】:Finding a vector that is approximately equally distant from all vectors in a set找到一个与集合中所有向量距离大致相等的向量
【发布时间】:2015-08-26 22:57:42
【问题描述】:

我有一组 300 万个向量(每个向量 300 个维度),我正在这 300 个昏暗空间中寻找一个 点,该点与所有其他点(向量)

我可以做的是初始化一个随机向量 v,然后对 v 进行优化,目标是:

其中 d_xy 是向量 x 和向量 y 之间的距离,但这在计算上会非常昂贵。

我正在为这个问题寻找一个近似解向量,它可以在非常大的向量集上快速找到。 (或者任何可以为我做类似事情的库——任何语言)

【问题讨论】:

  • 你试过了吗?
  • @farhawa 我尝试运行一个 python 脚本,该脚本使用 scipy.optimize.minimize() 来最小化我上面描述的目标函数。当然,它每次迭代涉及 3M 距离计算,然后 O(n^2) 通过向量集,所以它只能在合理的时间内对微小的向量集(大约 10000)起作用
  • 你能举一个你的向量的例子吗?
  • 我理解正确吗:你想找到所有距离上总和最小的向量 v |v - i|到您集合中的所有其他向量?也许一些随机方法是合适的,您可以在其中检查每个 v 的向量 i 的随机样本,并选择与该随机集有关的所有距离总和最小的一个。也许蒙特卡罗模拟可以提供帮助。只是我的两分钱(这不是一个高质量的评论,但可能是一个提示)de.wikipedia.org/wiki/Monte-Carlo-Simulation
  • @Asking Questions:对不起,如果我不太清楚——我正在寻找一个与所有其他向量同样远的向量(不是我的原始 3M 集合的一部分)。我并不是想减少我的向量与集合其余部分的距离总和。

标签: python vector linear-algebra mathematical-optimization approximate


【解决方案1】:

我同意,总的来说,这是一个非常棘手的优化问题,尤其是在您所描述的规模上。每个目标函数评估需要 O(nm + n^2) 为 n 个维度 m 的点工作 - O(nm) 来计算从每个点到新点的距离和 O(n^2) 来计算给定距离的目标.当 m=300 且 n=3M 时,这非常可怕。因此,即使是一个函数评估也可能难以解决,更不用说解决完整的优化问题了。

另一个答案中提到的一种方法是采用点的质心,可以有效地计算 - O(nm)。这种方法的一个缺点是它可能会在提议的目标上做得非常糟糕。例如,考虑一维空间中的情况,有 300 万个值为 1 的点和 1 个值为 0 的点。通过检查,最优解是 v=0.5,目标值为 0(与每个点等距),但质心将选择目标值为 300 万的 v=1(嗯,比这小一点)。

我认为比质心做得更好的一种方法是分别优化每个维度(忽略其他维度的存在)。虽然在这种情况下目标函数的计算成本仍然很高,但一些代数表明目标函数的导数很容易计算。它是值 4*((v-i)+(v-j)) 的所有对 (i, j) 的总和,其中 i v。请记住,我们正在优化单个维度,因此点 i 和 j 是一维的,v 也是如此。因此,对于每个维度,我们可以对数据进行排序 (O(n lg n)),然后计算值 v 的导数使用二分搜索和基本代数的 O(n) 时间。然后我们可以使用scipy.optimize.newton 来找到导数的零点,这将是该维度的最佳值。遍历所有维度,我们将得到问题的近似解决方案。

首先在一个简单的设置中考虑所提出的方法与质心方法,一维数据点 {0, 3, 3}:

import bisect
import scipy.optimize

def fulldist(x, data):
    dists = [sum([(x[i]-d[i])*(x[i]-d[i]) for i in range(len(x))])**0.5 for d in data]
    obj = 0.0
    for i in range(len(data)-1):
        for j in range(i+1, len(data)):
            obj += (dists[i]-dists[j]) * (dists[i]-dists[j])
    return obj

def f1p(x, d):
    lownum = bisect.bisect_left(d, x)
    highnum = len(d) - lownum
    lowsum = highnum * (x*lownum - sum([d[i] for i in range(lownum)]))
    highsum = lownum * (x*highnum - sum([d[i] for i in range(lownum, len(d))]))
    return 4.0 * (lowsum + highsum)

data = [(0.0,), (3.0,), (3.0,)]
opt = []
centroid = []
for d in range(len(data[0])):
    thisdim = [x[d] for x in data]
    meanval = sum(thisdim) / len(thisdim)
    centroid.append(meanval)
    thisdim.sort()
    opt.append(scipy.optimize.newton(f1p, meanval, args=(thisdim,)))
print "Proposed", opt, "objective", fulldist(opt, data)
# Proposed [1.5] objective 0.0
print "Centroid", centroid, "objective", fulldist(centroid, data)
# Centroid [2.0] objective 2.0

所提出的方法找到了精确的最优解,而质心方法则稍有偏差。

考虑一个稍微大一点的例子,它有 1000 个维度为 300 的点,每个点都来自高斯混合。每个点的值正态分布,均值为 0,方差为 1,概率为 0.1,均值为 100,方差为 1,概率为 0.9:

data = []
for n in range(1000):
    d = []
    for m in range(300):
        if random.random() <= 0.1:
            d.append(random.normalvariate(0.0, 1.0))
        else:
            d.append(random.normalvariate(100.0, 1.0))
    data.append(d)

所提议方法的最终目标值为 1.1e6,质心方法为 1.6e9,这意味着提议的方法将目标降低了 99.9% 以上。显然,目标值的差异受点分布的影响很大。

最后,为了测试缩放比例(删除最终的目标值计算,因为它们通常难以处理),我得到以下 m=300 的缩放比例:1,000 点为 0.9 秒,10,000 点为 7.1 秒,122.3 100,000 点的秒数。因此,对于包含 300 万个点的完整数据集,我预计这大约需要 1-2 小时。

【讨论】:

  • 感谢您的建议。贪婪的解决方案总是一个很好的起点(这应该是一个可能的近似值——我是一个计算机科学专业的学生!)另外,这是一个非常详尽的答案,我非常感谢你为编写脚本和估计我的数据集需要多长时间。再次感谢您。
【解决方案2】:

来自this question on the Math StackExchange

一般来说,没有一个点与 4 个或更多点等距 平面中的位置,或 n 维中的 n+2 个点。

用一个点表示一组点的标准是 在统计学、机器学习和计算机科学中考虑。这 质心是最小二乘意义上的最佳选择,但有 还有很多其他的可能性。

质心是平面上的点 C 平方距离 $\sum |CP_i|^2$ 是最小的。也可以优化 不同的中心性度量,或坚持代表 是其中一个点(例如加权的图论中心 生成树),或以某种方式为点分配权重, 取它们的质心。

请注意,具体而言,“质心是最小二乘意义上的最佳选择”,因此您的成本函数(即最小二乘成本)的最佳解决方案是简单地平均所有点的坐标(这将为您提供质心)。

【讨论】:

  • 我不相信 Math StackExchange 上的(已接受)答案。很容易构建一组点位于超球体上但其质心远离超球体本身中心的示例。
  • @StefanoM:是的,但我认为这个答案(或我的)没有说明这一点?如果你构造一组点都位于超球面的一个“极点”附近,那么显然该组的质心不会是超球面的中心。我想不出任何一组点均匀地沿着超球面分布,而它们的质心不会是超球面的中心。
  • 同意,但没有对给定点的空间分布做出假设......这里的重点是要知道,对于 OP 数据集,质心是一个好还是坏的选择。 “质心是最小二乘意义上的最佳选择”的一般陈述可能会产生误导。
  • 您引用的文字是说质心最小化到所有点的平方距离之和。 OP 要求最小化从新点到 i 和 j 的距离平方差的每对点 (i, j) 的总和,这是不同的。作为一个简单的例子,考虑一维空间中的点 {0, 3, 3},质心为 2。OP 的目标值为 2,这不是最优的(通过检查,最优解为 1.5,目标值为 0,因为它与所有点的距离相等)。
  • @josilber 也许是这样,但 OP 的公式似乎与他所声明的目标不一致。
猜你喜欢
  • 2016-12-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-11
  • 1970-01-01
  • 2021-12-18
相关资源
最近更新 更多