原始数据是[1 9 2 8 3 7]
嵌入:
比如选择的窗口长度L为3,得到的矩阵就是:
[1 9 2]
[9 2 8]
[2 8 3]
[8 3 7]
SVD分解:
Python里自带一个函数进行分解,就不用它参考文献上写的啥X乘X的转置了,函数是这个:
u, s, v = np.linalg.svd(嵌入得到的矩阵)
得到的三个结果是这样的
u是个形状为(4, 4)的矩阵,为啥是4我不知道
[-0.34748861 -0.67722177 0.41306458 -0.5 ]
[-0.62332023 0.4373678 -0.41253036 -0.5 ]
[-0.38669102 -0.52074809 -0.57383924 0.5 ]
[-0.58411781 0.28089413 0.57437346 0.5 ]
s是,形状为(3,)
[18.29004176 9.97102473 0.23030046]
奇艺谱就是s里取最大值,这里为 18.29004175999194
v是,形状是(3, 3)
[-0.62349202 -0.50409505 -0.59761683]
[ 0.44777196 -0.85683898 0.25559193]
[ 0.64090402 0.10823653 -0.7599519 ]
重构:
重构矩阵的计算方法是 newMatrix = value * u1 * v1
value就是奇艺谱,SVD分解里得到的s里的最大值,上面也提了一下,这里value是: 18.29004175999194
u1是在u的基础上,取第一行,为
[-0.34748861 -0.62332023 -0.38669102 -0.58411781]
v1是在u的基础上,取第一行,为
[-0.62349202 -0.50409505 -0.59761683]
计算时需要对u1进行转置,转置后的u1是:
[-0.34748861]
[-0.62332023]
[-0.38669102]
[-0.58411781]
重构完的矩阵就是:
[3.96265415 3.203817 3.79820225]
[7.10815385 5.74696232 6.81316231]
[4.40970654 3.56526011 4.22670177]
[6.66110146 5.38551921 6.3846628 ]
最后把重构完的矩阵再转变为一维数组:
设这个一维数组叫ret[],对于重构完的矩阵,对每一条次对角线进行计算,并把结果添加到ret[]里
利用两个动态的变量,这里分别叫sigma和alpha,sigma是每条次对角线的数据的和,alpha是次对角线长度
ret.append(sigma/alpha)
就相当于添加了每条次对角线的平均值。
过程大概是这样的:
pos is( 0 , 0 ) sigma+
alpha is 1 now
ret[] append
pos is( 1 , 0 ) sigma+,
pos is( 0 , 1 ) sigma+
alpha is 2 now
ret[] append
pos is( 2 , 0 ) sigma+
pos is( 1 , 1 ) sigma+
pos is( 0 , 2 ) sigma+
alpha is 3 now
ret[] append
pos is( 3 , 0 ) sigma+
pos is( 2 , 1 ) sigma+
pos is( 1 , 2 ) sigma+
alpha is 3 now
ret[] append
pos is( 3 , 1 ) sigma+
pos is( 2 , 2 ) sigma+
alpha is 2 now
ret[] append
pos is( 3 , 2 ) sigma+
alpha is 1 now
ret[] append
处理后的数据ret[]为:
[3.9626541544632476 5.155985423726059 4.651623704998423 5.67984129396347 4.806110489242382 6.384662797164128]
就是最终结果
备注:
因为窗口长度L的选择不宜超过数据长度的1/3,这里数据长度是6,L为了为了算着方便选的3,所以这个例子的效果不好,但是领会精神。
做为参考的话,处理数据的时候,数据长度是300+,L选的4。
源码访问:https://git.twtstudio.com/chenpeiqi/ssa/tree/master
参考文献https://www.ixueshu.com/document/8447b1aaa13538a2318947a18e7f9386.html