2015-04-05 5 views
2

Учитывая следующую кривуюКак найти точку перегиба рядов данных с использованием Matlab?

enter image description here

Я хотел бы определить индекс точки х-данных, где кривая начинает возрастать всерьез (в этом примере, который был бы вокруг х = 15).

Хотя я понимаю, что производные могут быть использованы для определения точек перегиба, обратите внимание, что данные являются шумными, и я не уверен, что этот подход позволил бы мне четко идентифицировать «истинную точку перегиба» (тогда x = 15).

мне интересно, если более простой подход был бы возможным, такие как

  • найти 4 точки данных, где x1 x2 < < < x3 x4
  • возвращение индекса x1

У вас есть любые предложения о том, как это сделать?

Выборочные данные из выше кривой

index  SQMean 
_____ ____________ 

'0'  '139.428574' 
'1'  '133.298706' 
'2'  '135.961044' 
'3'  '143.688309' 
'4'  '133.298706' 
'5'  '133.181824' 
'6'  '134.896103' 
'7'  '146.415588' 
'8'  '142.324677' 
'9'  '128.168839' 
'10'  '146.116882' 
'11'  '146.766235' 
'12'  '134.675323' 
'13'  '138.610382' 
'14'  '140.558441' 
'15'  '128.662338' 
'16'  '138.480515' 
'17'  '153.610382' 
'18'  '156.207794' 
'19'  '183.428574' 
'20'  '220.324677' 
'21'  '224.324677' 
'22'  '230.415588' 
'23'  '226.766235' 
'24'  '223.935059' 
'25'  '229.922073' 
'26'  '234.389618' 
'27'  '235.493500' 
'28'  '225.727280' 
'29'  '241.623383' 
'30'  '225.805191' 
'31'  '240.896103' 
'32'  '224.090912' 
'33'  '230.467529' 
'34'  '248.285721' 
'35'  '233.779221' 
'36'  '225.532471' 
'37'  '247.337662' 
'38'  '233.000000' 
'39'  '241.740265' 
'40'  '235.688309' 
'41'  '238.662338' 
'42'  '236.636368' 
'43'  '236.025970' 
'44'  '234.818176' 
'45'  '240.974030' 
'46'  '251.350647' 
'47'  '241.857147' 
'48'  '242.623383' 
'49'  '245.714279' 
'50'  '250.701294' 
'51'  '229.415588' 
'52'  '236.909088' 
'53'  '243.779221' 
'54'  '244.532471' 
'55'  '241.493500' 
'56'  '245.480515' 
'57'  '244.324677' 
'58'  '244.025970' 
'59'  '231.987015' 
'60'  '238.740265' 
'61'  '239.532471' 
'62'  '232.363632' 
'63'  '242.454544' 
'64'  '243.831161' 
'65'  '229.688309' 
'66'  '239.493500' 
'67'  '247.324677' 
'68'  '245.324677' 
'69'  '244.662338' 
'70'  '238.610382' 
'71'  '243.324677' 
'72'  '234.584412' 
'73'  '235.181824' 
'74'  '228.974030' 
'75'  '228.246750' 
'76'  '230.519485' 
'77'  '231.441559' 
'78'  '236.324677' 
'79'  '229.935059' 
'80'  '238.701294' 
'81'  '236.441559' 
'82'  '244.350647' 
'83'  '233.714279' 
'84'  '243.753250' 
+0

Почему вы отмечаете этот вопрос как 'c'? – chqrlie

+0

Привет, торр, было бы хорошо обратиться к вашему аналогичному предыдущему вопросу и объяснить, как это отличается от другого. –

+1

Нахождение 4 очков не очень надежное. Вы можете попытаться установить функцию шага в данные или скопировать значения в нижние и верхние, например. используя «kmeans (X, 2)», а затем используйте границы кластера, чтобы найти ваш переход. В любом случае может быть хорошей идеей сгладить данные сначала с помощью 'smooth' или, возможно,' wiener'. – Thomas

ответ

1

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

(нажмите на картинку для полного размера)

Функция имеет вид

a * (x < b) + c * (x > d) + ((x - b)/(d - b) * (c - a) + a) * (x >= b) * (x <= d) 

, который говорит: есть постоянная часть для x < b со значением a, другая постоянная часть для x > d со значением c и линейная рампа, соединяющая их.

Трудно установить такую ​​функцию и будет работать только хорошо, если вы предоставите достойные стартовые оценки (см. Небольшое окно на снимке экрана). Поэтому это не способ автоматизации процесса, а просто для получения улучшенных оценок.

В этом случае из исходной оценки b = 15 подгонки обеспечивает улучшенную оценку b = 16.58 с 95% -ci из [15.96, 17.2], что указывает, что индексы от 0 до 16 принадлежат к начальной части постоянной.

Инструмент для подбора кривой также может генерировать код из ваших графических интерфейсов. В этом случае возникает следующий результат:

[xData, yData] = prepareCurveData(index, SQMean); 

% Set up fittype and options. 
ft = fittype('a * (x < b) + c * (x > d) + ((x - b)/(d - b) * (c - a) + a) * (x >= b) * (x <= d)', 'independent', 'x', 'dependent', 'y'); 
opts = fitoptions(ft); 
opts.Display = 'Off'; 
opts.Lower = [-Inf -Inf -Inf -Inf]; 
opts.StartPoint = [140 15 230 20]; 
opts.Upper = [Inf Inf Inf Inf]; 

% Fit model to data. 
[fitresult, gof] = fit(xData, yData, ft, opts); 

% Plot fit with data. 
figure('Name', 'untitled fit 1'); 
h = plot(fitresult, xData, yData); 
legend(h, 'SQMean vs. index', 'untitled fit 1', 'Location', 'NorthEast'); 
% Label axes 
xlabel('index'); 
ylabel('SQMean'); 
grid on