如果你和朋友俩人都喜欢看《泰坦尼克》、《西雅图未眠人》、《廊桥遗梦》,但都不爱看《黑客帝国》、《盗梦空间》,那你们之间的兴趣一定很接近。人脑很容易根据一系列“A like X”的信息做出直觉的判断,但人脑能处理的数据量太小,也太慢,需要有算法来让计算机也能自动处理这样的兴趣相似度分析。线性代数中的矩阵奇异值分解(Singular Value Decomposition, 或 SVD)就是这样的算法之一。
矩阵奇异值分解(SVD)
对于任意矩阵 M,其奇异值分解就是 M = U * S * Vt,其中 U 为左矩阵,是一个方阵;S 为奇异值矩阵,是一个对角矩阵,对角线上的各值就是奇异值;Vt 为右矩阵,也是一个方阵;“*”是矩阵之间的点积运算(dot operation)。
奇异值分解的作用在于:把矩阵 M 看作一个坐标系下的若干点,寻找一个新的坐标系(即新的线性空间),使得该坐标系中第一个坐标轴的方向是最具“差异性”的方向(例如下图中的 v1),而这个方向对应的奇异值则能表示“差异”的程度有多大;该坐标系的第二个坐标轴是稍微次要一些的方向,其奇异值也要小一些;依此类推。所谓有“差异性”的方向是指能最大限度地体现出数据差别的方向,例如《西游记》可能大家都爱看,但不同人对《三体》的评价就差异非常大,所以《三体》对于分析个人的兴趣取向更有价值。