Расширение последовательности статистически в MATLAB - PullRequest
3 голосов
/ 24 декабря 2009

Существуют ли какие-либо встроенные функции в MATLAB, которые статистически расширяют последовательность действительных чисел, так что полученная последовательность расширяется до любого размера, который я хочу. У меня есть последовательность из 499 элементов, и я хочу расширить ее до 4096 элементов. Заранее спасибо.

Ответы [ 3 ]

2 голосов
/ 24 декабря 2009

Если вы хотите интерполировать вектор из 499 элементов с более высоким разрешением 4096 элементов, вы можете использовать функцию INTERP1 следующим образом (где x - ваш вектор из 499 элементов ):

y = interp1(x,linspace(1,499,4096));

Выше используется функция LINSPACE , чтобы сгенерировать вектор из 4096 элементов с линейным интервалом значений от 1 до 499, который затем используется в качестве точек интерполяции. По умолчанию функция INTERP1 использует линейную интерполяцию для вычисления новых значений между старыми точками. Вы можете использовать другие методы интерполяции следующим образом:

y = interp1(x,linspace(1,499,4096),'spline');  %# Cubic spline method
y = interp1(x,linspace(1,499,4096),'pchip');   %# Piecewise cubic Hermite method
1 голос
/ 24 декабря 2009

Если вам известно распределение данных в системе параметрического семейства распределений Pearson или Johnson , то вы можете сгенерировать больше данных, используя функции выборки pearsrnd и johnsrnd (полезно для генерации случайных значений без указания параметрического распределения)

Пример:

%# load data, lets say this is vector of 499 elements
data = load('data.dat');

%# generate more data using pearsrnd
moments = {mean(data),std(data),skewness(data),kurtosis(data)};
newData = pearsrnd(moments{:}, [4096-499 1]);

%# concat sequences
extendedData = [data; newData];

%# plot histograms (you may need to adjust the num of bins to see the similarity)
subplot(121), hist(data), xlabel('x'), ylabel('Frequency')
subplot(122), hist(extendedData), xlabel('x'), ylabel('Frequency')

или использование johnsrnd:

%# generate more data using johnsrnd
quantiles = quantile(data, normcdf([-1.5 -0.5 0.5 1.5]));
newData = johnsrnd(quantiles, [4096-499 1]);


С другой стороны, если вы хотите предположить непараметрическое распределение, вы можете использовать функцию ecdf или функцию ksdensity .Пожалуйста, обратитесь к демонстрационному примеру Непараметрические оценки кумулятивных функций распределения и их инверсий для полного примера (настоятельно рекомендуется!).

1 голос
/ 24 декабря 2009

Я не совсем понимаю слово "статистически" в вопросе, но из ваших комментариев кажется, что вам просто необходима линейная (или плавная) интерполяция. Попробуйте с interp1q или interp1 .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...