Поиск пары чисел оптимально близких к заданному константному числу - страница 2

 

Столбцы - это независимые переменные?

ДельтаАДельтаБ


Потом, как получаем значения в столбце

СуммДельт

?

 
Dennis Kirichenko:

Столбцы - это независимые переменные?

ДельтаАДельтаБ


Это разница по моделю между А и константой и Б и константой. Сумма дельт - складываем значение из столбца ДельтаА и ДельтаБ.

 
Aleksey Vyazmikin:

Вот таблица с данными, и промежуточными вычислениями:

ИндексABКонстантаДельтаАДельтаБСуммДельт
1 5,36 5,80 5 0,36 0,80 1,16
2 4,92 5,45 5 0,08 0,45 0,52
3 4,47 4,98 5 0,53 0,02 0,55
4 4,05 4,56 5 0,95 0,44 1,39
1 4,89 5,53 5 0,11 0,53 0,64
2 4,32 5,00 5 0,68 0,00 0,68
1 5,03 5,80 5 0,03 0,80 0,82
2 4,45 5,21 5 0,55 0,21 0,76
1 5,06 5,88 5 0,06 0,88 0,94
2 4,42 5,30 5 0,58 0,30 0,88
1 4,95 5,92 5 0,05 0,92 0,97
2 4,32 5,34 5 0,68 0,34 1,02
1 4,79 5,84 5 0,21 0,84 1,05
2 4,24 5,27 5 0,76 0,27 1,04
1 4,68 5,68 5 0,32 0,68 1,00
2 4,11 5,11 5 0,89 0,11 1,00
1 4,50 5,50 5 0,50 0,50 1,00
1 4,88 5,89 5 0,12 0,89 1,01
2 4,23 5,29 5 0,77 0,29 1,07
1 4,52 5,64 5 0,48 0,64 1,11
1 4,85 5,98 5 0,15 0,98 1,13
2 4,24 5,38 5 0,76 0,38 1,15
1 4,56 5,73 5 0,44 0,73 1,17
1 4,26 5,46 5 0,74 0,46 1,20
1 4,56 5,71 5 0,44 0,71 1,15
2 4,04 5,19 5 0,96 0,19 1,15
1 4,32 5,46 5 0,68 0,46 1,14
1 4,60 5,76 5 0,40 0,76 1,17

Нам нужно найти пару чисел наиболее близко расположенных к числу 5.

Если усреднить последний столбец, то получим число 1, очевидно, что те суммы дельт, которые меньше единицы подлежат более пристальному рассмотрению. В нашем случае стоит, видимо выбирать между вторым и третьем индексом-вариантом, но это вовсе не обязательно, так как у нас дельта А могла быть 0,51 ,а дельта Б 0 - казалось бы этот вариант в сумме довал 0,51 и был бы предпочтительней, но это не так, из-за более сильного смещения дельты А.

В таком случае что означает столбец "Индекс"?
 
Alexey Viktorov:
В таком случае что означает столбец "Индекс"?

Да пусть это будет индекс массива(за минусом нулевого) или номер по порядку - не важно.

Ах да, индекс то с ошибкой скопировался из экселя - счям исправлю.
 
Aleksey Vyazmikin:

Это разница по моделю между А и константой и Б и константой. Сумма дельт - складываем значение из столбца ДельтаА и ДельтаБ.

В правильно заданном вопросе - половина ответа.

Спасибо за визуальное удобство при оформлении. У Вас:

ИндексABКонстантаДельтаАДельтаБСуммДельт
15,365,8050,360,801,16
24,925,4550,080,450,52
34,474,9850,530,020,55


Я бы так сделал:

   Индекс   А В  Константа  ДельтаА  ДельтаВ  СуммДельт 
1 5,36  5,8050,360,801,16
24,92 5,4550,080,450,52
.....................


Нужно в итоге найти минимум в столбце СуммДельт?

 
Dennis Kirichenko:

В правильно заданном вопросе - половина ответа.

Спасибо за визуальное удобство при оформлении. У Вас:

ИндексABКонстантаДельтаАДельтаБСуммДельт
15,365,8050,360,801,16
24,925,4550,080,450,52
34,474,9850,530,020,55


Я бы так сделал:

   Индекс   А В  Константа  ДельтаА  ДельтаВ  СуммДельт 
1 5,36  5,8050,360,801,16
24,92 5,4550,080,450,52
.....................

Критику принимаю - свои ошибки увидеть сложней всего, спасибо.

Dennis Kirichenko:


Нужно в итоге найти минимум в столбце СуммДельт?

Ох, если бы это было так просто...

Нет, нужно найти наиболее малые дельты, при этом нужно учитывать две дельты, т.е. не должно быть сильных перекосов.

 

МНК как предложили ранее должно подойти
https://ru.wikipedia.org/wiki/Метод_наименьших_квадратов

Если двумя словами, то складывайте на ДельтаА + ДельтаВ, а возводите сначала дельты в квадрат - 
ДельтаА*ДельтаА + ДельтаВ*ДельтаВ

Если не понравится и разброс дельт будет всё равно большой - то возводите дельты в третью степень. Или в четвёртую. Итд.

 
Aleksey Vyazmikin:

Ох, если бы это было так просто...

Нет, нужно найти наиболее малые дельты, при этом нужно учитывать две дельты, т.е. не должно быть сильных перекосов.


Ну наверное можно ввести условия ограничения для перекоса.

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


Красным выделил выброс. 

Ещё по этому моменту:

Нет, нужно найти наиболее малые дельты, при этом нужно учитывать две дельты, т.е. не должно быть сильных перекосов...

А почему так? Не потеряем ли информационные качества выборки при этом?

 
Aleksey Vyazmikin:

Вот таблица с данными .....

Нам нужно найти пару чисел наиболее близко расположенных к числу 5.

Если усреднить последний столбец, то получим число 1, очевидно, что те суммы дельт, которые меньше единицы подлежат более пристальному рассмотрению. В нашем случае стоит, видимо выбирать между вторым и третьем индексом-вариантом, но это вовсе не обязательно, так как у нас дельта А могла быть 0,51 ,а дельта Б 0 - казалось бы этот вариант в сумме довал 0,51 и был бы предпочтительней, но это не так, из-за более сильного смещения дельты А.

По моему , Вам нужно найти пару для которой выполнены следующие условия :

1. Максимум ( Дельта А , Дельта Б ) самое малое из всех пар.

2. Минимум ( Дельта А + Дельта Б )

3. Условие 1 имеет приоритет !

 
Aleksey Vyazmikin:

Прошу помочь в решении задачи.

Даны два ряда чисел от 0 до 100, которые в паре друг с другом в случайном порядке (условно) и не могут переставляться по отдельности. Есть условное число, которое задается пользователем - от 0 до 100.

Нужно найти пары чисел, которые наиболее близки к заданному числу, при этом надо оценивать каждое число в паре по отдельности - чем ближе тем лучше.

Я начал с того, что нашел дельты от заданного числа для каждого ряда чисел, которые учитываю по модулю, т.е. без знака "-".

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

Проблема в том, что, если суммировать две дельты, то можно найти наименьшее общее расстояние, но этого не достаточно.

Вот, пусть заданное число 3, есть дельты пар чисел: (-2;4),(-2;4),(-4;1),(-3;3),(-5;1),(-6;0) - мне надо выбрать тот вариант, который с обеих сторон ближе к центру относительно других вариантов - т.е. дает меньшую совокупную погрешность. Казалось бы это будет (-3;3) - но как это автоматизировать, и хочется задать критерий отклонения, т.е. отклонение на 10 больше чем в два раза критичней, чес отклонение на 5.

Какие есть идеи, как решить подобную задачу?


Вот кусочек моего кода. Эта функция используется для поиска ближайшей к текущей цене зоны поддержки. Максимумы всех возможных зон хранится в массиве Max[]. Переменная ZCount это ArraySize(Max). Я думаю ее можно переделать для вашего случая.

int CRSZona::NearestSupportArea(void)
{   
   
   if (ZCount==0) return(-1);
   if (ZCount==1)
   { 
      if (Bid>Max[0]) return(0);
      return(-1);
   }
   double temp[];
   int    ind[];
   for (int i=0;i<=ZCount-1;i++)
   {                 
         if (Bid>Max[i]) 
         {
            ArrayResize(temp,ArraySize(temp)+1);
            ArrayResize(ind,ArraySize(ind)+1);
            temp[ArraySize(temp)-1]=Max[i];
            ind[ArraySize(ind)-1]=i;
         }
   }
   if (ArraySize(temp)==0) return(-1);
   int max = ArrayMaximum(temp);
   if (max>=0)
      if (Bid>Max[ind[max]]) return(ind[max]);
   return(-1);
}