• 奇异谱分析(SSA)matlab


    最近在做的是通过将一个正弦函数(三个不同频率),分解重构,原理过程可以参考下面两个

    [机器学习] 奇异谱分析(SSA)原理及Python实现-CSDN博客

    奇异谱分析(SSA)的matlab实现_奇异谱分析 matlab-CSDN博客

    运行的文件是SSA1.m,其他的.m文件都是SSA调用的。具体代码如下:

    SSA1.m

    1. %输入合成信号y
    2. f1=50;
    3. f2=90;
    4. f3=410;
    5. fs=50;%采样频率
    6. t=0:1/fs:1;
    7. y=sin(2*pi*f1*t)+sin(2*pi*f2*t)+sin(2*pi*f3*t);
    8. plot(t,y,'r*-');
    9. %ssa
    10. n = length(y); %测试数据长度
    11. l = 10; %输出窗口长度L
    12. [y1,lamuda]=SSA_function(y,n,l); %进行奇异谱分析得到L个初等矩阵
    13. ref = 0.95;
    14. [x] = Contribution_rate(lamuda,l,ref); %根据贡献率选择重构阶数,阈值根据需求设置
    15. [coll] = w_collelation(y1,l,n); %权相关分析得到w-correlation图
    16. figure(1)
    17. HeatMap(coll);
    18. yout = zeros(1,n);
    19. for i=1:l
    20. subplot(5,2,i);
    21. plot(y1(i,:))
    22. end
    23. for i=1:x
    24. yout(1,:) = yout(1,:) + y1(i,:);
    25. end
    26. figure(2)
    27. plot(1:n,y,'-r',1:n,yout,'-g')
    28. %% 输出趋势项
    29. prompt = '趋势项阶数: '; %根据w-collelation图输入重构阶数
    30. x = input(prompt); %根据权重图选择要重构信号
    31. yout = zeros(1,n);
    32. for i=1:x
    33. yout(1,:) = yout(1,:) + y1(i,:);
    34. end
    35. figure(3)
    36. plot(1:n,yout,'-r')
    37. %% 输出周期项
    38. prompt = '输出周期项: '; %根据w-collelation图输入重构阶数
    39. x2 = input(prompt); %根据权重图选择要重构信号
    40. yout = zeros(1,n);
    41. for i=x+1:x2
    42. yout(1,:) = yout(1,:) + y1(i,:);
    43. end
    44. figure(4)
    45. plot(1:n,yout,'-g')

    SSA_function.m

    1. %% 奇异谱分析函数
    2. %x 原始时间序列;n一维时间序列x的维度;l窗口长度(为周期的整数倍,不超过n/2)
    3. % 返回的y的维度是[窗口长度l*序列长度n],表示l个初等矩阵;
    4. function [y,lamuda]=SSA_function(x,n,l)
    5. % Step1 : 建立时滞矩阵
    6. k1=n-l+1;
    7. X2=zeros(l,k1);
    8. for i=1:k1
    9. X2(1:l,i)=x(i:l+i-1);
    10. end
    11. % Step 2: 奇异值分解
    12. x3=X2*X2';
    13. [U,S,V] = svd(x3);
    14. for i=1:l
    15. V1(:,i) = X2'*U(:,i)/sqrt(S(i,i));
    16. end
    17. %初等矩阵重构得到l个时间序列;
    18. y = zeros(l,n);
    19. Lp=min(l,k1);
    20. Kp=max(l,k1);
    21. for i=1:l
    22. xi = sqrt(S(i,i)) * U(:,i) * V1(:,i)';
    23. y1=zeros(n,1);
    24. for k=0:Lp-2
    25. for m=1:k+1
    26. y1(k+1)=y1(k+1)+(1/(k+1))*xi(m,k-m+2);
    27. end
    28. end
    29. %重构 Lp~Kp
    30. for k=Lp-1:Kp-1
    31. for m=1:Lp
    32. y1(k+1)=y1(k+1)+(1/(Lp))*xi(m,k-m+2);
    33. end
    34. end
    35. %重构 Kp+1~N
    36. for k=Kp:n-1
    37. for m=k-Kp+2:n-Kp+1
    38. y1(k+1)=y1(k+1)+(1/(n-k))*xi(m,k-m+2);
    39. end
    40. end
    41. y(i,:) = y1(:,1);
    42. end
    43. %将特征值输出一列
    44. %lamuda = zeros(l,1)
    45. for i = 1:l
    46. lamuda(i,1) = S(i,i);
    47. end
    48. end

    w_collection.m

    1. %% 权相关
    2. function [coll] = w_collelation(y,l,n)
    3. k = n-l+1;
    4. coll = zeros(l,l);
    5. for i =1:l
    6. for j =1:l
    7. if l
    8. xfc = 0.0;
    9. xfx = 0.d0;
    10. xfy = 0.0;
    11. for h=1:n
    12. if h >= 1 && h
    13. w = h;
    14. elseif h >= l && h
    15. w=l;
    16. elseif h >= k && h<=n
    17. w = n-h+1;
    18. end
    19. xfc = xfc + w*y(i,h)*y(j,h);
    20. xfx = xfx + w *y(i,h)^2;
    21. xfy = xfy + w * y(j,h)^2;
    22. end
    23. coll(i,j) = xfc/(sqrt(xfx)*sqrt(xfy));
    24. end
    25. end
    26. end
    27. end

    Contrabution_rate.m

    1. %% 计算奇异值的贡献率
    2. function [n,array2] = Contribution_rate(lamuda,l,ref) %输入奇异值、窗口长度、阈值(0,1)
    3. sum1 = sum(lamuda(:));
    4. for i=1:l
    5. sum2 = sum(lamuda(1:i));
    6. num = sum2/sum1;
    7. array2(i) = num;
    8. if num >= ref
    9. n = i;
    10. break
    11. end
    12. end
    13. end

    实现效果如下:

    heatmap是原始图与重构图的相关性,可以根据权重来改变参数。最右边是不同奇异值对应的子图,左下图是原始与重构的图,左上是原始图。

  • 相关阅读:
    echarts 树形图
    代码随想录二刷 Day36
    探秘URL的奥义:JavaScript中轻松获取页面参数值的N种姿势【含代码示例】
    windows WSL配置cuda,pytorch和jupyter notebook
    浅谈——网络安全架构设计(二)
    Linux 实践项目之论坛搭建
    Tomcat报错总结
    javascript学习之数据类型转换
    redis-设置从节点
    文献学习(part97)--Pseudo-supervised Deep Subspace Clustering
  • 原文地址:https://blog.csdn.net/weixin_48433993/article/details/133658748