Мультисигнал 1-D является набором 1-D сигналов той же длины, что и матрица, организованная rowwise (или columnwise).
Цель этого примера состоит в том, чтобы показать, как анализировать, обесценивать или сжимать мультисигнал, а затем кластеризировать различные представления или упрощенные версии сигналов, составляющих мультисигнал.
В этом примере сигналы сначала анализируются, и получаются различные представления или упрощенные версии:
Восстановленные приближения на заданных уровнях,
Деноизмененные версии,
Сжатые версии.
Шумоподавление и сжатие являются двумя основными приложениями вейвлетов, часто используемых как шаг предварительной обработки перед кластеризацией.
Последний шаг этого примера выполняет несколько стратегий кластеризации и сравнивает их. Это позволяет суммировать большой набор сигналов с помощью разреженных представлений вейвлет.
Чтобы проиллюстрировать эти возможности, давайте рассмотрим реальный мультисигнал, представляющий 35 дней потребления электрической нагрузки, центрированный и стандартизированный.
load elec35_nor; % Load normalized original data. X = signals; [nbSIG,nbVAL] = size(X); plot(X','r') axis tight title('Original Data: 35 days of electrical consumption'); xlabel('Minutes from 1 to 1440');
Мы видим, что сигналы являются локально нерегулярными и шумными, но тем не менее можно различить три различные общие формы.
В порядок, чтобы выделить периодичность мультисигнала, давайте теперь рассмотрим данные с помощью представления 3-D.
surf(X) shading interp axis tight title('Original Data: 35 days of electrical consumption') xlabel('Minutes from 1 to 1440','Rotation',4) ylabel('Days from 1 to 35','Rotation',-60) ax = gca; ax.View = [-13.5 48];
Представленные пять недель теперь можно увидеть более четко.
Выполните вейвлет-разложение на уровне 7, используя вейвлет 'sym4'.
dirDec = 'r'; % Direction of decomposition level = 7; % Level of decomposition wname = 'sym4'; % Near symmetric wavelet decROW = mdwtdec(dirDec,X,level,wname);
Сгенерированная структура разложения выглядит следующим образом:
decROW
decROW = struct with fields: dirDec: 'r' level: 7 wname: 'sym4' dwtFilters: [1x1 struct] dwtEXTM: 'sym' dwtShift: 0 dataSize: [35 1440] ca: [35x18 double] cd: {1x7 cell}
Давайте восстановим приближения на уровне 7 для каждого сигнала строки. Затем, чтобы сравнить приближения с исходными сигналами, давайте отобразим два графика (см. рисунок ниже). Первый показывает все исходные сигналы, а второй показывает все соответствующие приближения на уровне 7.
A7_ROW = mdwtrec(decROW,'a',7); subplot(2,1,1) plot(X(:,:)','r') title('Original Data') axis tight subplot(2,1,2) plot(A7_ROW(:,:)','b') axis tight title('Corresponding approximations at level 7')
Как видно, общая форма захватывается приближениями на уровне 7, но некоторые интересные функции теряются. Например, шишки в начале и в конце сигналов исчезли.
Чтобы более точно сравнить исходные сигналы с соответствующими их приближениями на уровне 7, давайте отобразим два графика (см. рисунок ниже). Первый касается четырех первых сигналов, а второй - пяти последних сигналов. Каждый из этих графиков представляет исходные сигналы, наложенные с соответствующим приближением на уровне 7.
subplot(2,1,1) idxDays = 1:4; plot(X(idxDays,:)','r') hold on plot(A7_ROW(idxDays,:)','b') axis tight title(['Days ' int2str(idxDays), ' - Signals and Approximations at level 7']) subplot(2,1,2) idxDays = 31:35; plot(X(idxDays,:)','r') hold on plot(A7_ROW(idxDays,:)','b') axis tight title(['Days ' int2str(idxDays), ' - Signals and Approximations at level 7'])
Как видно, приближение исходного сигнала визуально точна с точки зрения общей формы.
Чтобы выполнить более тонкое упрощение мультисигнала, сохраняя эти выпуклости, которые явно связаны с электрическим сигналом, давайте обнулим мультисигнал.
Процедура шумоподавления выполняется с использованием трех этапов:
1) Разложение: Выберите вейвлет и уровень разложения N, а затем вычислите вейвлет-разложение сигналов на уровне N.
2) Порог: Для каждого уровня от 1 до N и для каждого сигнала выбирается порог и применяется порог к коэффициентам детализации.
3) Реконструкция: Вычислите реконструкции вейвлет с помощью исходных коэффициентов приближения уровня N и измененных коэффициентов детализации уровней от 1 до N.
Давайте выберем теперь уровень разложения N = 5 вместо N = 7, используемый ранее.
dirDec = 'r'; % Direction of decomposition level = 5; % Level of decomposition wname = 'sym4'; % Near symmetric wavelet decROW = mdwtdec(dirDec,X,level,wname); [XD,decDEN] = mswden('den',decROW,'sqtwolog','mln'); Residuals = X-XD; subplot(3,1,1) plot(X','r') axis tight title('Original Data: 35 days of electrical consumption') subplot(3,1,2) plot(XD','b') axis tight title('Denoised Data: 35 days of electrical consumption') subplot(3,1,3) plot(Residuals','k') axis tight title('Residuals') xlabel('Minutes from 1 to 1440')
Качество результатов хорошее. Удары в начале и в конце сигналов хорошо восстанавливаются, и, наоборот, невязки выглядят как шум, за исключением некоторых оставшихся ударов из-за сигналов. Кроме того, величина этих оставшихся ударов имеет небольшой порядок.
Как и шумоподавление, процедура сжатия выполняется с использованием трех этапов (см. выше).
На шаге 2 находится различие с процедурой шумоподавления. Существует два подхода к сжатию:
Первый состоит в том, чтобы принимать вейвлет расширения сигналов и сохранять наибольшие коэффициенты абсолютных значений. В этом случае можно задать глобальный порог, эффективность сжатия или относительную квадратную норму эффективности восстановления. Таким образом, необходимо выбрать только один зависящий от сигнала параметр.
Второй подход состоит в применении визуально определенных зависящих от уровня порогов.
Чтобы упростить представление данных и сделать более эффективным сжатие, вернемся к разложению на уровне 7 и сжимаем каждую строку мультисигнала, применяя глобальный порог, приводящий к восстановлению 99% энергии.
dirDec = 'r'; % Direction of decomposition level = 7; % Level of decomposition wname = 'sym4'; % Near symmetric wavelet decROW = mdwtdec(dirDec,X,level,wname); [XC,decCMP,THRESH] = mswcmp('cmp',decROW,'L2_perf',99); subplot(3,1,1) plot(X','r') axis tight title('Original Data: 35 days of electrical consumption') subplot(3,1,2) plot(XC','b') axis tight title('Compressed Data: 35 days of electrical consumption') subplot(3,1,3) plot((X-XC)','k') axis tight title('Residuals') xlabel('Minutes from 1 to 1440')
Как видно, общая форма сохраняется, в то время как локальными неровностями пренебрегают. Невязки содержат шум, а также компоненты из-за небольших шкал по существу.
Теперь рассмотрим соответствующие плотности ненулевых элементов.
cfs = cat(2,[decCMP.cd{:},decCMP.ca]); cfs = sparse(cfs); perf = zeros(1,nbSIG); for k = 1:nbSIG perf(k) = 100*nnz(cfs(k,:))/nbVAL; end figure plot(perf,'r-*') title('Percentages of nonzero coefficients for the 35 days') xlabel('Signal indices') ylabel('% of nonzero coefficients')
Для каждого сигнала процент необходимых коэффициентов для восстановления 99% энергии лежит между 1,25% и 1,75%. Это иллюстрирует способность вейвлетов концентрировать энергию сигнала в нескольких коэффициентах.
Кластеризация предлагает удобную процедуру для суммирования большого набора сигналов с помощью разреженных представлений вейвлет. Иерархическую кластеризацию можно реализовать с помощью mdwtcluster
. Для использования необходимо иметь Statistics and Machine Learning Toolbox™ mdwtcluster
.
Сравните три различные кластеризации 35-дневных данных. Первое основано на исходном мультисигнале, второе на коэффициентах приближения на уровне 7, а последнее основано на деноцированном мультисигнале.
Установите количество кластеров равным 3. Вычислите P1 и P2 структур, которые содержат соответственно два первых раздела и третий.
P1 = mdwtcluster(decROW,'lst2clu',{'s','ca7'},'maxclust',3); P2 = mdwtcluster(decDEN,'lst2clu',{'s'},'maxclust',3); Clusters = [P1.IdxCLU P2.IdxCLU];
Теперь мы можем проверить равенство трех разделов.
EqualPART = isequal(max(diff(Clusters,[],2)),[0 0])
EqualPART = logical 1
Так что три перегородки одинаковы. Давайте теперь постройте и исследуем кластеры.
figure stem(Clusters,'filled','b:') title('The three clusters of the original 35 days') xlabel('Signal indices') ylabel('Index of cluster') ax = gca; xlim([1 35]) ylim([0.5 3.1]) ax.YTick = 1:3;
Первый кластер (маркированный как 3) содержит 25 дней в середине недели, а два других (маркированные как 2 и 1) содержат пять субботних и пять воскресных дней соответственно. Это снова иллюстрирует периодичность базовых временных рядов и трех различных общих форм, наблюдаемых на двух первых графиках, отображаемых в начале этого примера.
Теперь давайте отобразим исходные сигналы и соответствующие коэффициенты приближения, используемые для получения двух из трех разбиений.
CA7 = mdwtrec(decROW,'ca'); IdxInCluster = cell(1,3); for k = 1:3 IdxInCluster{k} = find(P2.IdxCLU==k); end figure('Units','normalized','Position',[0.2 0.2 0.6 0.6]) for k = 1:3 idxK = IdxInCluster{k}; subplot(2,3,k) plot(X(idxK,:)','r') axis tight ax = gca; ax.XTick = [200 800 1400]; if k==2 title('Original signals') end xlabel(['Cluster: ' int2str(k) ' (' int2str(length(idxK)) ')']) subplot(2,3,k+3) plot(CA7(idxK,:)','b') axis tight if k==2 title('Coefficients of approximations at level 7') end xlabel(['Cluster: ' int2str(k) ' (' int2str(length(idxK)) ')']) end
Те же самые разбиения получают из исходных сигналов (1440 выборок для каждого сигнала) и из коэффициентов приближений на уровне 7 (18 выборок для каждого сигнала). Это иллюстрирует, что использования менее 2% коэффициентов достаточно, чтобы получить те же кластерные разделы 35 дней.
Шумоподавление, сжатие и кластеризация с помощью вейвлетов являются очень эффективными инструментами. Способность вейвлета представлений концентрировать энергию сигнала в нескольких коэффициентах является ключом к эффективности. В сложение кластеризация предлагает удобную процедуру для суммирования большого набора сигналов с помощью разреженных вейвлетов представлений.