聊到里,就忍不住想讲一下作者以前做过的一个项目,作者找工作的时候靠聊这个项目拿到了腾讯跟阿里的offer。故事是这样的,作者当年在某灯具厂做暑期实习,他们在做 smart building 项目(智能大楼?),作者负责其中的灯具定位功能。具体来说,就是想知道本厂生产的灯具都安装在了楼层的哪些位置。位置信息还是蛮有用的,因为灯具上面还可以安装很多的功能传感器,比如温度啊,湿度啊,动作感应啊之类,可以监控整个楼层的各个位置的信息,p.s. 隔壁还利用位置信息跟动作传感器做出了房间人口估算,路线追踪等功能,开发出了员工考勤系统 ,在这个系统的监视下,就不敢上班时间到处乱晃了 T T。
描述一下这个需求,已知整个楼层的建筑布局跟本厂灯具的安装位置,想要得到建筑蓝图上标出的每盏灯具的MAC address (其实也就是灯具的ID)。本质上这其实是个对号入座的问题,具体的位置都有了,我们只需要把正确的ID填进去就行了。然而怎么判定“正确”呢?想到的方法是利用灯具之间的相对距离,从整体上考虑一个最合理的填充方法。这其实就变成了一种 graph drawing 问题。
那么要如何找到灯具之间的相对距离呢?直接测量是非常困难的,但是我们可以利用亮度来间接测量距离,因为从物理上讲,光源的亮度跟距离是成反比的。大半夜里让整个楼层只开一盏灯,然后让其他的灯上的亮度传感器来测量接收到的亮度,这样就可以记录下两盏灯之间的亮度,亮度没啥用,但是嵌在亮度信息里的距离信息却非常有用。依次打开每一盏灯,我们就得到了两两灯具间的近似距离(adjecent matrix)。
这样以来,我们就把一个现实问题转化成了一个数学问题,并且找到了一个工程上的可行做法。解决这个数学问题的模型正是MDS。MDS解决的问题恰好是:已知高维上样本点两两之间的距离,尝试在低维上(通常是2维,但是可以是任意维)找到一组新的样本点,使降维后两点间的距离与它们在高维上的距离相等,对应的优化问题就是:
其中,表示高维上的距离, 表示低维上的映射。这个问题看上去很直观,但解法却相当地精巧复杂,需要一些线性代数的知识跟相当的耐心才能整明白,作者重新花了一个下午整理了一下这个过程。
重新思考下这个问题,我们想得到一系列点,这些点两两之间的距离矩阵Z需要尽可能地靠近已有的距离矩阵P。这样来看,这个问题也有点像矩阵近似问题,如果是矩阵近似问题,就可以用我们的老朋友SVD分解来得到了。实际上也是这个问题最后也是通过SVD来得到低维度点的,下面先让我们看一下标准的解法,再细致地推演下为什么可以这么解:
- 得到高维度上的距离矩阵P
- 得到一个神奇的 double centering 矩阵 , 其中,, (N个1的列向量)。
- 对B进行SVD分解,得到前m个最大的特征值,跟与之对应的m个特征向量
- 低维度上的点为
最难想通的地方是如何通过神奇矩阵B把问题转化成SVD分解问题。下面让我们在只有3个样本点的情况下推演一遍整个过程。假设低维度上的点分别为, 那么低维度上的距离矩阵D由这种元素组成:, 整个D矩阵可以表示成
我们的目标是让D矩阵尽可能地靠近P矩阵,如果把D矩阵进行神奇的double centering 操作:
惊奇地发现JDJ居然最终可以写成矩阵相乘的形式:。 那么JX 有什么物理意义呢?
可以发现,JX其实也就是把X给减掉均值,这时候就能联系起来前面提到的 double centering 了。 值得注意的是centering的过程相当于平移,并不会改变低维度点之间的距离。到此为止,解MDS问题就相当于:找到一些低维度的点 使得 这样就回到了我们的老朋友SVD的怀抱,于是上面解MDS的步骤就可以 make sense 了 :)
那么把MDS用在我们的灯具定位系统里面会怎么样呢?时隔多年,当时的数据都丢失了,仿真构造下面这个非常简单的楼层布局:
蓝色的部分是墙壁,正确的灯具ID在楼层中按照如图所示的分布。由于灯光不能穿透墙壁,3号灯打开的时候,8-14号灯可能根本感受不到亮度,所以我们还是不能测量到它们之间相对距离。在仿真中,我们假设如果两个灯之间有墙壁,那么亮度为0,否则,亮度与距离的2.5次方成反比(实际测试差不多就是这个样子)。直接在我们得到的亮度矩阵上使用MDS可以得到下面的结果:
可以看到,效果并不是很好,很多灯的位置都重叠在了一起。导致这种结果其实是因为墙壁阻挡了光线的传播,导致我们无法某些灯之间的距离。比如,对灯7来说,3跟6 都看不见,距离都是无限远(亮度为0,假设距离与亮度成反比,距离就是无限远),体现在结果上就是3跟6重合在了一起。
ISOMAP恰好能解决这个问题。ISOMAP的思想跟MDS其实差不多,区别就是ISOMAP把距离矩阵又做了一次加工,它的距离矩阵使用的是两点之间的最短距离。还记得算法书里面的 all pair shortest path -- floyd warshall 算法吗?采用最短距离矩阵跟上面MDS的解法,就可以得到ISOMAP的降维结果:
对比可以发现,ISOMAP的结果少做矫正,就能得到原始的灯具分布了。为什么ISOMAP能解决MDS解决不了的问题呢?以灯6与灯7为例,ISOMAP可以让我们可以通过 7-> 4 -> 5 ->6 计算出(7,6)之间的距离,而且这个距离与 7-> 4 -> 5 ->3 不同,于是就可以避免3跟6重叠在一起。按照惯例再上一个蛋卷图让大家感受下MDS跟ISOMAP跟前面讲的算法的区别:
灯具定位问题是作者自认为到目前为止解决得最漂亮的问题,这套系统最终被某灯具厂的产品部作为商用。当然对作者来说,最有价值的是形成了工作中解决问题的一般思路:先尽量把问题model成一个数学问题,再考虑可行的工程方法尝试来解决它。数学本质是关键,决定给出的solution是否solid,考虑工程时方法脑洞要开阔(除了亮度传感器,作者当时也尝试过recieved signal strength,效果差不多)。另外就是,能讲一个精彩并且完整的故事真的很有用,至今仍常常缅怀给面试官们讲灯具定位系统时他们眼睛里喷薄欲出的赞许
原文:https://zhuanlan.zhihu.com/p/25412211