零基础理解推荐系统中的张量和张量分解(一)
**
零基础理解推荐系统中的张量和张量分解 **
本人最近要做一个推荐系统的算法研究,里面用到了张量和张量分解来补充一些稀疏的评分值。
所以我在网上找了很多介绍张量的文章,看完感觉一头雾水,光是秩、阶、维这三个东西我都完全分不清楚,每个文章都写的有所不同。
我翻阅了各种资料,最后有了一点自己的理解。现在把我理解的张量和张量分解写出来,有错误希望各位指正。(我下面所说的张量都是数组形式,用于推荐系统中表示用户的评分信息,不适用于物理张量等其他内容,简单来说张量就是一个具有某种排列形式的数据的集合)
首先讲一下阶、秩、维的概念和区别:
矩阵的阶:一个m行n列的矩阵简称为m×n矩阵,特别把一个n×n的矩阵成为n阶正方阵,或者n阶矩阵。就是说矩阵的阶就代表矩阵(必须是方阵)的大小,例如7阶矩阵就是7×7的方阵。
矩阵的秩:通过初等变换可以把矩阵里面的一些行变成全0,就是说矩阵里的一些行可以用其他的行来代替(例如1 1 2可以表示3 3 6),如果一个n阶的方阵只用n-1行就能表示,那么矩阵的秩就是n-1。矩阵的秩是相对于n×n方阵来说的,如果矩阵是m×n的,那么就分为行秩和列秩,行秩和列秩中的min值就是矩阵的秩。
!!!而张量的阶和秩和矩阵的阶和秩没有任何关系,除了名字都叫阶和秩以外没有任何关系。
所以当看到张量的阶和秩的时候不要去联想矩阵的阶和秩。
张量的阶:照我的理解张量的阶就是索引的个数。
标量是第0阶张量,表示出来就是一个值 1
向量是第1阶张量,表示出来就是一维数组[1, 2, 3, 4]
矩阵是第2阶张量,表示出来就是二维数组[[1, 2],[3, 4]]
三阶张量,表示出来就是三维数组[[[1, 2], [3, 4]], [[5, 6], [7, 8]]]
张量的阶就是索引的个数,意思就是,当我想找2这个元素时,在向量a[1, 2, 3, 4]里面它是a[1],在矩阵b[[1, 2],[3, 4]]里面它是b[0][1],在三阶张量c[[[1, 2], [3, 4]], [[5, 6], [7, 8]]]里面它是c[0][0][1]。需要几个索引能找到其中的元素就是几阶张量,或者说用几维数组来表示就是几阶张量。
张量的秩:
我在百度百科和CSDN上的多篇文章上看到这样一句话:张量的阶数也称为维度、轴、秩。
但是我在张量分解里面又不止一次看到三阶秩一张量这种话,这就使我彻底糊涂了,阶就是秩的话,三阶秩一张量又是个什么东西?难道秩一的意思不是秩为1?我百思不得其解。
首先了解
秩一张量:如果一个K阶张量能够表示成K个向量的外积,那么该张量称为秩一张量,举例子说明。
[1 2]○[3 4] = [[3 4]][6 8]]
[[3 4]][6 8]]这个2阶张量可以表示成2个向量[1 2]和[3 4]的外积,所以[[3 4]][6 8]]就是秩一张量。
这个○就代表向量的外积,是不是和之前我们初中高中学的向量的外积不一样。因为确实是两个不同的外积。分别是Outer Product和Exterior Product。这两个东西翻译过来都叫外积,但实际上是两种完全不同的东西,也导致很多初学者(我)把它和之前学的搞混了,导致完全无法理解。
现在看看两种外积的区别:
文章图片
这个图是转载一篇CSDN文章上的,https://blog.csdn.net/dl_007/article/details/82933213
上面基本把两种外积的不同说清楚了。我们这里用的是Outer Product,也就是张量积,而不是只能用在三维向量上的Exterior Product。我发现很多文章包括百度百科甚至一些教科书上都混淆了这两种外积。为了方便区分,我接下来用张量积来表示Outer Product。
这里张量积有的地方用○表示,有的用?表示,可能后一种更正规吧,因为时间有限,我这里简单提一下,之后有时间我会找到最正确的格式告诉大家。
了解了张量积之后,秩一张量的表述就成了如果一个K阶张量能够表示成K个向量的张量积,那么该张量称为秩一张量。
就如同上面的例子[1 2]○[3 4] = [[3 4]][6 8]], [[3 4]][6 8]]就是一个秩1张量,而且是一个二阶秩一张量。
下面开始介绍张量分解,张量分解主要有两种方式:Tucker分解和CP分解,虽然我个人更喜欢Tucker分解,但是我的算法研究里面用的是CP分解,所以下面主要介绍CP分解。(CP分解可以看成Tucker分解的特例,理解CP就肯定能理解Tucker分解)
【零基础理解推荐系统中的张量和张量分解(一)】CP分解:
将一个张量表示成有限个秩一张量之和,比如一个三阶张量可以分解为
推荐阅读
- 深入理解Go之generate
- 考研英语阅读终极解决方案——阅读理解如何巧拿高分
- 由浅入深理解AOP
- 逻辑回归的理解与python示例
- 日志打卡
- Python基础|Python基础 - 练习1
- 「按键精灵安卓版」关于全分辨率脚本的一些理解(非游戏app)
- Java|Java基础——数组
- 深入理解|深入理解 Android 9.0 Crash 机制(二)
- 不理解句意,你还想做对所有GRE填空题()