O korelacji na konkretnym przykładzie: czym się różnią funkcje cov, xcov, corrcoeff i xcorr? Jak interpretować wartości współczynników korelacji i kowariancji oraz funkcji podobieństwa?
O wspomnianych w nagłówku funkcjach oraz ich interpretacji taktuje film na moim kanale. Wyjaśniam w nim zawiłości związane z obliczaniem podobieństwa między sygnałami na przykładzie danych pomiarowych z zegarka biegowego. Dane można pobrać tutaj, a listing programu jest poniżej.
clear all; close all; clc load 2022_garmin_data %% Rysunki figure; subplot(211); plot(t, V, 'LineWidth', 2); my_figure('', 'V [km/h]', 'Prędkość'); grid on; subplot(212); plot(t, HR, 'r', 'LineWidth', 2); my_figure('czas [min]', 'HR [bpm]', 'Tętno'); grid on; %% Współczynnik KOWARIANCJI %% 1 - Analitycznie wsp_cov1 = dt * sum((V-mean(V)) .* (HR-mean(HR))) / to wsp_cov2 = sum((V-mean(V)) .* (HR-mean(HR))) / (N-1) %% 2 - Funkcja MATLABa m_cov = cov(V,HR) %% Funkcja kowariancji [f_cov, lags] = xcov(V, HR, 'unbiased',N/2); tal=lags*dt; figure; plot(tal, f_cov, 'LineWidth', 2); my_figure('Tal [min]', 'Cxy', 'Funkcja kowariancji V-HR'); grid on; %% Współczynnik kowariancji na podstawie funkcji kowariancji wsp_f_cov = f_cov(tal==0) %% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% Współczynnik KORELACJI %% 1 - Analitycznie przez normowanie współczynnika kowariancji varV = var(V); varHR = var(HR); stdV = std(V); stdHR = std(HR); wsp_kor1_1 = m_cov(1,1) / varV wsp_kor1_2 = m_cov(1,2) / (stdV * stdHR) wsp_kor2_2 = m_cov(2,2) / varHR m_kor_cov = [wsp_kor1_1 wsp_kor1_2; wsp_kor1_2 wsp_kor2_2] %% Funkcja MATLABa m_kor = corrcoef(V, HR) %% Funkcja korelacji %% 1 - Bezpośrednie wywołanie funkcji xcorr [f_kor_raw, lags] = xcorr(V, HR, 'unbiased', N/2); figure; subplot(211); plot(tal, f_kor_raw, 'LineWidth', 2); my_figure('Tal [min]', 'Rxy raw', 'Funkcja korelacji V-HR'); %% 2 - xcorr z odjętymi wartościami średnimi i unormowana [f_kor_norm, lags] = xcorr(V - mean(V), HR - mean(HR), 'coef', N/2); tal=lags*dt; subplot(212) plot(tal, f_kor_norm, 'LineWidth', 2); my_figure('Tal [min]', 'Rxy', 'Unormowana funkcja korelacji V-HR'); grid on; %% 3 - na podstawie funkcji kowariancji f_kor_cov = f_cov / (stdV * stdHR); hold on; plot(tal, f_kor_cov, 'LineWidth', 2); my_figure('Tal [min]', 'Rxy', 'Unormowana funkcja korelacji V-HR'); grid on; legend('xcorr normowana', 'na podst. xcov') %% Współczynnik korelacji na podstawie funkcji korelacji wsp_f_kor = f_kor_norm(tal==0)
Funkcja do szablonu rysunków:
function my_figure(opisX, opisY, tytul) %% Zmienione argumenty wejściowe funkcji na opisy osi! %% CREATEFIGURE2(X1, Y1) <-- Taka była pierwotna składnia funkcji. % X1: vector of x data % Y1: vector of y data % Auto-generated by MATLAB on 18-Mar-2020 10:38:53 % Create figure % figure1 = figure; % To usuwamy, gdyż rysunek będzie tworzony % na zewnątrz funkcji % Create axes % axes1 = axes; % To również usuwamy, gdyż obiekt axes, jest już % stworzony na aktywnym rysunku axes1 = gca; hold(axes1,'on'); % Create plot % plot(X1,Y1,'LineWidth',2); % To samo dotyczy linii % Create ylabel % ylabel({'Opis osi Y'}); % Podmieniamy, tak aby móc wprowadzać ylabel(opisY); % swój tekst. Podobnie z xlabel i title % Create xlabel xlabel(opisX); % Create title title(tytul); % Uncomment the following line to preserve the X-limits of the axes % xlim(axes1,[0 1]); box(axes1,'on'); % Set the remaining axes properties set(axes1,'FontName','Century Gothic','FontSize',12,... 'LabelFontSizeMultiplier',1.3,'TitleFontSizeMultiplier',1.1,'XGrid','on',... 'LineWidth',1,'TickLength',[0.02 0.025],'XMinorTick','on','YGrid','on','YMinorTick','on'); %% Jeżeli rysunek zawiera więcej niż jedną linia, konieczna jest pętla: % liczba_lini = size(axes1.Children); % for k = 1 : liczba_lini % axes1.Children(k,1).LineWidth = 2; % end
(Visited 691 times, 1 visits today)