00:02
3.4.2非负矩阵分解非负矩阵分解那negative max factorization n MF是另一种无监督学习算法,其目的在于提取有用的特征。它的工作原理类似于PCA,也可以用于降维,与PCA相同。我们试图将每个数据点写成一些分量的加权求和。但在PC中,我们想要的是正交分量,并且能够解释尽可能多的数据方差。而在NMF中,我们希望分量和系数均为非负,也就是说,我们希望分量和系数都大于或等于零。因此,这种方法只能应用于每个特征都是非负的数据,因为非负分量的非负求和不可能变为负值。将数据分解成非附加全求和的这个过程对由多个独立源相加或叠加创建而成的数据特别有用,比如多人说话的音轨。或者包含多种乐器的音乐。在这种情况下,NMF可以识别出组成合成数据的原始分量。总的来说,与PC相比,NMF得到分量更容易解释,因为负的分量和系数可能会导致难以解释的抵消效应。cancellation effect举个例子。
01:19
图三杠九。在书上118页。中的特征点同时包含正数和负数。我们在PCA的说明中也提到过,正负号实际上是任意的。在将NMF应用于人脸数据之前,我们先来简要回顾一下模拟数据。一将NMF应用于模拟数据。与使用PCA不同,我们需要保证数据是正的。NMF能够对数据进行操作,这说明数据相对于原点零,零的位置实际上对NMF很重要。因此,你可以将提取出来的恢复分量看作是从零零到数据的方向。
02:06
下面的例子。给出了NMF在二维玩具数据上的结果。看我这里的这两幅图也是可以的,当然也可以看书上121页的图三杠13。对于两个分量的NMF。就像左边这幅图。显然,所有数据点都可以写成这两个分量的正数组合。如果有足够多的分量能够完美的重建数据,分量个数与特征个数相同,那么算法会选择。指向数据极值的方向。如果我们仅使用一个分量,那么NMF会创建出一个指向平均值的分量,因为指向,这里可以对数据做出最好的解释。
03:08
你可以看到,与PC不同,减少分量个数不仅会删除一切方向,而且会重新创建一组完全不同的分量。NMF的分量也没有按照任何特定的方法进行排序,所以不存在第一非复分量的说法。所有分量的地位平等。NMF使用了随机初始化,根据随机种子的不同可能会产生不同的结果。在相对简单的情况下,比如两个分量的模拟数据,所有数据都可以被完美的解释,那么随机性的影响分享。虽然可能会影响分量的顺序或尺度。在更加复杂的情况下,影响可能会很大。二将NMF应用于人脸图像。现在我们将NMF应用于之前用过的while的数据集中的label faces n MF的主要参数是我们想要提取的分量个数。通常来说,这个数字要小于输入特征的个数,否则的话,将每个像素作为单独的分量就可以对数据进行解释。
04:14
首先,我们来观察分量个数如何影响NMF重建数据的好坏。反向变换的数据质量。与使用PC是类似,但要稍微差一点,这是符合预期的,因为PC找到的是重建的最佳方向。NMF通常并不用于对数据进行重建或编码,而是用于在数据中寻找有趣的模式。我们尝试仅提取一部分分量,比如15个。初步观察一下数据。
05:00
其结果可以看到书上123页图三杠15,当然也可以看到我这里的。这些。图像。绘图的代码部分相对来说比较简单。这些分量都是正的,因此比图三杠九所示的PC分量更像人脸的圆形。例如,你可以清楚的看到分量三。显示了稍微向右转动的人脸。而分量期则显示了稍微向左转动的人脸。我们来看一下这两个分量特别大的那些图像。
06:17
在这一段代码中。朗派点阿。是一个比较新的函数。他到底是做什么事的?我来讲一下,在讲它之前,我们先来讲一下囊派结构体数组定义结构体数组囊派点元组序列ad type等于二元组序列。底态不中元素的格式元素是个元素吗?元组中第一个元素是结构体成员变量名,也就是字符串,第二个元素是结构体的成员变量类型。设N等于DT的长度。A中元素是一个N元组。任取其中一个元素即为B,对任意的A属于负N,一直到。
07:02
零点。BI的类型,一横等于1TYPE的第个元素的。第一个元素。举个例子。A,它就表示一个结构体数组。这个结构体。它有两个成员,变成X和Y,类型分别都是32位的整数。这个结构体数组一,零。X等于一,Y等于零表示第一个结构体。X等于零,Y等于一表示第二个结构体。直接这样看可能会有点费劲。我们把它画成下面这样的表格形式。
08:01
就会显得很清晰。关于结构体数组就讲到这里。看到朗派A,这是它的原型。带着索引排序返回一个整数数组。其中元素是排序之后的数组元素在输入数组的,所以该运算即为A。参数A,一个类似数组的一项待排序数组例子。结果是怎么来的?我来讲一下。首先。把A数组A写在一张表格里。然后。对数。进行排序。注意,这里代号索引。排序的时候,你要把索引跟着带上。
09:03
这样子索引你就不是按顺序来了。但是数所谓的值确实按顺序的。然后把索引往下一抄。就可以得到输出数组。从右从左往右读一、二、零就是输出数组。千万不要看上面的索引。X整数或者那沿着哪一条轴进行X运算,默认是负一,也就是最后一条轴。如果是或使用展平之后的数组。关于常用的参数取值及其描述可以看一下表。重点看一下第一行、第四行和第五行。第一行输入数组A的尾数是N为X等于long。描述,将数组展平,然后进行运算。第四行二维X等于零,把A看成是一个由行向量组构成的一个矩阵。对这个。
10:06
它这个由列向量组构成的一个矩阵,对这个列向量组中每个列向量都有分量。分别带着行索引进行二运算,返回变化之后的行索引。第五行也是二维数组X等于一,把A看成是一个由行向量组构成的一个矩阵,对这个行向量组中每个行向量的所有分量带着列,所以进行啊,So运算。这里有三个例子。写在了一起。第一个例子的执行过程。X等于,那所以我要先把X展平。0312。接着对X进行排序代号索引。排好序之后,索引也跟着变动的顺序。把索引。
11:01
往输出数组这里抄一遍。就得到了输出数组,从左往右读一遍就是输出数组。第二个例子的执行过程。X等于零。看成列向量组构成的矩阵。带着行索引进行运算。先把这个二维数组。写成这样的格式。紧接着在吧。这里的数据值。也就是数组值写成行索引逗号值这么一个二元组格式。接下来对着每一列的元组,按照第二个元素值进行排序。对于每一个元组。排好序之后,对于每一个元素,只保留它的第一个元素。
12:02
这一块就是输出数组。第三个例子的执行过程,X等于一,看成行向量组构成的矩阵。对每个行向量的所有分量带着列索引进行运算。依旧是老样子先吧。二维数组写成这个表格的格式。紧接着把表格中的数组值。写成列索引逗号值这么一个二元组格式,然后对每一列的每一行的元组按照第二个元素值进行排序。对于每一个元素,只保留它的第一个元素。这一块就是。输出数组。看一比较简单,Quick he3选一,特选参数默认quick排序算法解释。
13:02
比较简单,Kind等于quick thought对应快速排序,Me对应规定排序,He对应规排序。需要注意的是,快速排序用的是改进版的快速排序。它在递归次数过多的时候切换成堆排序,这可以确保最坏时间复杂度为O乘上多高点,而不是O的平方。Order。字符串或者字符串序列可选参数,当A是一个结构体数组的时候。该参数用于声明第一关键字、第二关键词,以此类推,一个字符串对应一个关键字。关键字就是结构体成员变量名不需要声明所有的关键字,但如果关键字没有被声明,就会按照type中的顺序进行排列。例子。首先,我要定义一个结构体数组。
14:02
这个结构体。有两个成员变量,一个X,一个Y。这里有两个例子。第一个例子。先按照X排序,在X相同的情况下,按照Y。做排序。它的执行过程是怎样的?先把结构体数组写成这种表格形式。看到这里XY,所以我先按照成圆边的X排序,在X对应取值相同的情况下,按照成员边的Y排序,注意带上索引。排好序之后,把这个索引这一列。从上往下读一遍,一,零就是输出数组。第二个例子的执行过程,注意到这里是YX,所以先按照成员变量Y排序。
15:03
在Y对应取值相同的情况下,按照成员变量X排序带上所引。实际上。就是上面这幅这张表,因为上面这张表已经默认情况已经给我们排好了。排好序之后。把索引这一列从上往下读,就得到了输出数组。回到书上。
16:11
分量三系数较大的人脸是前两行,分量七系数较大人脸都一定后两行。正如所料,分量三系数较大的人脸都是向右边看的人脸。好,分量期系数加到人脸。都是向左边看的人脸。如前所述,提取这样的模式最适合,最适合于具有叠加结构的数据,包括音频、基因表达和文本数据。我们通过一个模拟数据的例子看一下这种用法。假设我们对一个信号感兴趣,它是三个不同的信号源合成的。
17:13
非常不幸的是。光看这一幅图。我们没有办法观测到原始的信号,只能观测到三个信号的叠加混合。我们想要将混合的信号分解成原始分量。假设我们有许多种不同的方法来观测信号,比如有100台测量装置,每种方法都为我们提供了一系列的测量结果。因为有100台测量装置。所以我们需要将数据混合成为100维的状态。
18:04
在混合的过程中。我们注意到。NP派点random.random data。是什么意思,以及它的一个方法或者属性,Uniform是什么意思,还有UN dot。首先看到派点random.random state,它的原型。See等于now。实际上这不是一个函数,而是一个类,执行这么一行代码,会创建一个对应的实例。参数C的无符号32位整数可选参数默认是到随机种子,如果修改其默认值,就会使得该实例的所有方法在相同参数的题在相同参数下返回相同的值。也就是说该实例的所有方法的输出都是确定的,否则是不确定的。
19:04
现在看到该实例的一个方法。在我这地方是uniform。这是它对应的圆形,根据指定返回指定形状的数组,数组范围从low到high前臂后开的区间这么一个范围内做均匀分布采样。形状通过参数size来指定。参数漏浮点数或者一个类似浮点数组的对象可选参数默认0.0范围的起点是包含的。嗨,浮点数或者一个类似浮点数的浮点数数组的对象可选参数默认1.0范围的中点是不包含的size,整数或者整数元子可选参数默认的输出数字形状。具体解释看下表。S等于,那输出零为数组,也就是一个数S等于整数。长度等于S的一位数组,S等于单元组。输出长度等于S0的一为数组,S等于N,元素N大于等于二,形状等于S2NN为数组。
20:09
No high和输出数组的和输出数组必须可以广播到相同的形状。来看一个比较复杂的例子。这是漏,这是海,这是输出数组的形状。因为楼的形状是二单元组,氦的形状是空元组。也就是一个数嘛,零位数组输出数组的形状是三号二元组,所以。对low high和输出数组进行广播。当然输出数组不需要进行广播,因为它已经广播好了,广播之前和广播之后是一样的。所以对楼害进行广播。紧接着既输出数组为AAI等于uniform。No I hi ii不一定是一个整数,有可能是一个整数元组。在针对多维数组超过一维的情况下,它就有可能是个整数元组了。
21:03
比较简单。这一行算是解决了,接下来看到这一行。南派点dot。它的,它是什么意思,要进行分类讨论,AB是两个数组。或者两个数也可以。当A与B都是一位数组的时候。把A和B看成是两个向量,进行点乘运算,A向量点乘B向量。得到一个数。当A和B都是二维的时候,把A和B分成两个矩阵,进行矩阵乘法运算。A在前面,B在后面。千万不能反过来,因为矩阵的乘法没有交换律。A的为数是N为,B的为数是零为。或者A的为数是零为,B的为数是N为。
22:00
这就等价于A乘上B。两个都是一样的。当A的为数是N为,B的为数是一为,这个时候,你必须确保。A的形状的最后一个。最后一个元素和B的形状的第零个元素。是相等的。这个时候把A看成是多个行向量组,其中的每个行向量与B做点乘运算,结果放在行向量的对应位置上。当A和B的维数都是M,为的都是多维的时候。设,这里设A的为数是NB的为数是M,必须确保a.shape的负一等等于b.C的负二,输出数组的形状是A点。去掉负一。在拼接上b.shape去掉for。假设a.C等于I1,一直到I b.S等于G1 G21直到GM。令KP的KP属于。
23:02
零,一一直到IP减一,LQ属于零,一一直到JQ减一。其中P属于一,二,一直到NQ属于一二,一得到M,那么do AB。他就是一个。N减MN加M减二为的一个数组。N,也就是N减一加M减一,N里面去掉一个。I。M里面去掉一个。也就是B里面借了个GM减一。所以我这地方KN没有了。这地方LM减一也没有了。Dota AB这个多维数组中。这么一个索引的。一个元素,它就等于。对,这一个向量乘上这一个向量。
24:02
乘出来的新的向量做一下求和,也就是。简单说就是这两个向量的。数量机。参数。A。一个类似数组的对象或者一个数,它是第一个操作数B一个类似数组对象或者一个数,它是第二个操作数out,一个数组可选参数存放结果的输出数组形状和输出数的形状是一致的,元素类型和输出数组元素类型是一致的。在内存中必须是行优先的一段连续的空间,如果凹等于,那会返回一个新数组,否则返回它的引用。视力。第一个例子比较简单,派点DOT34,直接三乘四。他这两个。
25:01
他这两种情况的任意一种情况就行了。第二点什么?A是一个二维数组,B是一个二维数组number派点do。到这种情况。矩阵乘法运算。1001乘以。412。1001是单位取证,乘了等于没乘,所以结果是C1。接下来的情况就比较复杂了,A是一个三维数组。四层。12344层。三行两列的一个。三维数组B是一个一维数组。南派点dota AB。这个结果是怎么来的?其实很简单。
26:00
我们稍后再说。接下来看一个更复杂的情况。A,它是一个四维数组。一。二。三。是。五五对。四层。三行两列的一个四位数组。是一个。两行。三列的二位数组那派点都是AB,结果也比较长。先来看这一个例子。A是一个三维数组,B是一个一维数组。我们先把它的执行过程是这样的,先把A中最里面的每一个一位数组看成是一个向量。
27:09
这是最里面的。这样子我们就把三维数组。通过这样的方法降成了二维降维打击一下。你完全没有必要去想象三维数组是什么样子的。再把上面的二维向量组,也就是这样的一个向量数组写成矩阵的形式,注意啊,千万不要理解这是正的矩阵。把B看成是一个向量,记为B箭头,那么do AB也就等于。这样一个矩阵。因为一个向量点乘一个向量是一个数,里面的元素都是一个数,二维的。
28:02
这不就是一个矩阵吗?不相信的话,可以用上面的例子带结果算。就比如说我算一下。这一个向量乘上这一个向量。负一,零乘上零,负一。结果不就是零吗?这一这个地方的执行过程,A是一个四维数组。B是一个二维数组。执行过程,这样先把A中最里面的每个二维数组看成是一个矩阵。这是最里面的那个二位数组,这也是一直这样下去。
29:00
这样子我就把四位数组给降成了二维数组。再把上面的二维矩阵组写成矩阵的形式。注意啊,千万不要理解成这是一个真的矩阵。写好之后,把B看成是一个矩阵,即为大写的B,那么到AB也就等于。这样一个。矩阵形式的,也就是矩阵的矩阵结果还是一个四维数组。结果可不是一个真的矩阵,我们需要先把这个矩阵形式变成二维矩阵组。再把里面的每个矩阵因为矩阵相乘,得到还是一个矩阵。给还原神对应的二位数组。还原之后才能得到结果。
30:02
将数据混合成100维的状态。如果这个这一块代码。弄懂了,我们接着往下看,我们可以用NMF来还原这三个信号。为了对比。我们也应用了PCA。接着,我们将。观察之。真正的原始信号。NMF恢复的信号和PC恢复的信号。做一下可视化进行对比。图中包含来自X的100次测量中的三次,用于参考。你可以看到NMF在发现原始信号源时得到了非常不错的结果。
31:11
而PC则失败了。123第三行的这幅图对应的是NMF的。最后一个对应的是PCA的。当然,这幅图在书上126页,图三杠19。PC,我们可以发现仅使用第一个成分来解释数据中的大部分变化。要记住,NMF生成的分量是没有顺序的,在这个例子中,NMF分量的顺序与原始信号完全的相同。我们就会看到三条曲线的颜色。但这个纯属偶然。
32:02
还有许多其他算法可用于将那个数据点分解为一系列固定分量的加权求和。正如PC和NMF所说的那样,讨论所有这些算法已经超出了本数的范围,而且描述对分量和系数的约束通常涉及概率论。如果你对这种类型的模式提取感兴趣,我们推荐你看一下S用户指南中关于独立成分分析ICA因子分析、FA和系数编码、字典学习等内容。所有这些内容都可以在关于分解方法的页面中找到。
我来说两句