|
задача аппроксимировать таблицу двумерной линейной функцией | ☑ | ||
---|---|---|---|---|
0
wormselfish
28.11.16
✎
09:16
|
Помогите придумать решение задачи.
Есть двумерный массив (или таблица) размера N * N В каждой ячейке таблицы с координатами (индексами) X, Y записано значение Z Нужно придумать алгоритм аппроксимации этого массива, чтобы можно было его заменить на простую двумерную функцию F(X, Y) которая возвращает Z Важно!!! 1. Функция должна быть линейная во всех направлениях 2. Алгоритм должен быть ОЧЕНЬ простой, потому что рассчитываться он будет на компьютере, а мы с вами знаем на сколько прожорливое сейчас программное обеспечение до ресурсов. Поэтому если алгоритм будет сложный, но начнутся тормоза. Какие есть идеи? |
|||
1
Asmody
28.11.16
✎
09:22
|
МНК. Чмы, второй курс.
|
|||
2
DGorgoN
28.11.16
✎
09:24
|
Смотря какое применение будет в итоге. Я бы через нейронные сети прогнал бы )
|
|||
3
Asmody
28.11.16
✎
09:25
|
(1)+ в 95м году считали на 386 на матлабе матрицы до 1000х1000. Вроде не тормозило.
|
|||
4
wormselfish
28.11.16
✎
09:29
|
(1) Вообще не годится. Медленно
(3) Сравнил или какие тогда были быстрые языки программирования (ассемблер) или какие сейчас (1С, макросы...). |
|||
5
wormselfish
28.11.16
✎
09:30
|
(2) Зачем? Линейное же все по условию. Мне кажется решение должно быть очень простое.
|
|||
6
Это_mike
28.11.16
✎
09:32
|
(4) да на фортране считали, на СМ1420...
(5) решение и правда простое - см.(1) |
|||
7
wormselfish
28.11.16
✎
09:34
|
(6) см (4)
|
|||
8
Это_mike
28.11.16
✎
09:34
|
хотя фраза "линейная во всех направлениях" - понравилась...
|
|||
9
wormselfish
28.11.16
✎
09:35
|
(8) Это необходимое условие
|
|||
10
spock
28.11.16
✎
09:36
|
(0) А если в excel'е эти данные проанализировать, то линейность видно полученных значений? Почему линейная функция, а не полином?
|
|||
11
wormselfish
28.11.16
✎
09:37
|
(10) Потому что в итоге должна быть линейная. Если у значений нет линейности, значит ее все равно нужно сделать.
|
|||
12
Остап Сулейманович
28.11.16
✎
09:38
|
Я один не понял фразу "двумерной линейной функцией"?
Я знаю слов : 1. "функция первого порядка" и график еЯ - прямая. 2. "функция второго порядка" и график еЯ - кривая второго порядка (парабола, гипербола ...) ... гармоническая функция ... |
|||
13
Это_mike
28.11.16
✎
09:39
|
(11) ну тогда (конечное-начальное)/количество шагов - вот тебе и коэфициент
|
|||
14
Это_mike
28.11.16
✎
09:40
|
(12) ну ты что, про "семь красных линий" не слышал?
|
|||
15
wormselfish
28.11.16
✎
09:40
|
(12) Не только лишь все не поняли. Большинство поняли.
|
|||
16
wormselfish
28.11.16
✎
09:41
|
(13) Конечное и начальное могут быть случайными числами не отражающими общей тенденции
|
|||
17
Это_mike
28.11.16
✎
09:42
|
(15) зачем мэру линейная аппроксимация массива? он же в голову ест...
|
|||
18
Это_mike
28.11.16
✎
09:42
|
(16) тогда МНК для минимизации ошибки :-)
|
|||
19
spock
28.11.16
✎
09:42
|
(12) Похоже это какое-то институтское задание для заочников с заведомо кривой постановкой, либо перевратое от непонимания. Двумерность в (0), скорее всего, имелось в виду про массив.
|
|||
20
Лодырь
28.11.16
✎
09:43
|
(0) Позабавило:
2. Алгоритм должен быть ОЧЕНЬ простой, потому что рассчитываться он будет на компьютере, а мы с вами знаем на сколько прожорливое сейчас программное обеспечение до ресурсов. |
|||
21
wormselfish
28.11.16
✎
09:43
|
(18) Точно! Спасибо!
|
|||
22
wormselfish
28.11.16
✎
09:43
|
(19) Там так и написано вообще-то.
|
|||
23
spock
28.11.16
✎
09:45
|
(22) там написано "двумерной линейной функцией", об этом сказано в (12). Линейная функция на то и линейная, потому что не двумерная :)
|
|||
24
Остап Сулейманович
28.11.16
✎
09:45
|
(18) МНК - функция ОДНОЙ переменной. А у ТСа - две.
Ему нужно получить коэффициенты для уравнения плоскости. |
|||
25
Остап Сулейманович
28.11.16
✎
09:46
|
(23) У него функция двух переменных.
Это имелось ввиду. |
|||
26
wormselfish
28.11.16
✎
09:46
|
(23) Ты наверное с одномерной спутал.
|
|||
27
wormselfish
28.11.16
✎
09:48
|
(24) МНК и для двух переменных можно применить, но сильно долго считает. Нужно ускорить
|
|||
28
Asmody
28.11.16
✎
09:48
|
Напиши на чем-нибудь быстром.
|
|||
29
Лодырь
28.11.16
✎
09:49
|
(27) Какой размер матрицы? Порядок хотя бы?
|
|||
30
wormselfish
28.11.16
✎
09:49
|
(28) Медленное писать на быстром? А если быстрое написать на быстром будет ведь еще быстрее?
|
|||
31
Это_mike
28.11.16
✎
09:50
|
(30) напиши быстрое на быстром. кто мешает?
|
|||
32
Это_mike
28.11.16
✎
09:51
|
(24) ну так и минимизируется квадрат отклонений от плоскости.
|
|||
33
spock
28.11.16
✎
09:51
|
(25) Я хз, кто чего имел ввиду, но мне в школе и ВУЗе преподавали линейную функцию такую: https://ru.wikipedia.org/wiki/Линейная_функция
|
|||
34
wormselfish
28.11.16
✎
09:52
|
(29) например 4096*4096 нужно сто матриц посчитать максимум за 1 секунду на слабом железе на чем-нибудь кросплатформенном (EcmaScript, Java)
|
|||
35
wormselfish
28.11.16
✎
09:52
|
(31) Хорошо. Только придумаю сначала алгоритм, и сразу напишу
|
|||
36
Базис
naïve
28.11.16
✎
09:53
|
Гугли уже. Скармливай ему матрицу-картинку грейскейлом, обратно получай жпег минимального качества, читай параметры самого крупного элемента жпега.
Кусочно-линейная или плоская? Картинку давай! |
|||
37
Cool_Profi
28.11.16
✎
09:53
|
(34) "EcmaScript, Java"
А в Нью-Йорк на воздушном змее тебе слетать не надо? Тут уж или крестик, или трусики. Т.е. или быстро, или кроссплатформено и универсально |
|||
38
Базис
naïve
28.11.16
✎
09:54
|
(34) Видео надо на DSP распознавать, а не жаваскриптом.
|
|||
39
Это_mike
28.11.16
✎
09:54
|
||||
40
wormselfish
28.11.16
✎
09:56
|
(36) Как вариант можно. Спасибо за совет. Но не жпег конечно, а блур какой-нибудь применить, и получить градиент в итоге.
Не кусочно линейная. Просто линейная одним куском. Да плоская |
|||
41
Это_mike
28.11.16
✎
09:56
|
(36) ну можно тупо выровнять уровни методом сеток в несколько итераций, и получим практически готовую линейную
|
|||
42
wormselfish
28.11.16
✎
09:57
|
(38) Не каждый юзер захочет себе покупать DSP
|
|||
43
Asmody
28.11.16
✎
09:58
|
Вот тут http://www.delphikingdom.com/asp/viewitem.asp?catalogid=1368 , п.7 — готовый код на паскале.
|
|||
44
wormselfish
28.11.16
✎
09:58
|
(41) Щас посмотрю что это за метод сеток такой
|
|||
45
wormselfish
28.11.16
✎
09:59
|
(43) МНК уже кто-то предлагал, ты опоздал
|
|||
46
Это_mike
28.11.16
✎
10:01
|
(45) вообще-то, он как раз успел. ибо он и предлагал. см.(1)
|
|||
47
Asmody
28.11.16
✎
10:05
|
4096*4096 даблов — это, на секундочку, 128 мегабайт.
На haskell алгоритм перепиши. Он как раз для таких случаев. |
|||
48
vde69
28.11.16
✎
10:05
|
вообще для многомерных массивов применяют двухуровневые алгоритмы, типа "строй и перестраивай", "разделяй и властвуй" и подобное...
хотя я задачу нифига не понял, чего надо можешь простым языкам расписать? |
|||
49
Asmody
28.11.16
✎
10:08
|
Если пофиг на точность, а главное — скорость, то возьми произвольные три точки в матрице, не лежащие на одной прямой, и натяни на них плоскость.
|
|||
50
Лодырь
28.11.16
✎
10:15
|
(49) Если бы было пофиг на точность, он бы наверное уменьшил размерность для начала, не?
|
|||
51
vde69
28.11.16
✎
10:33
|
лет 10 натягивал на подобный массив 3д сеть, на 1с массив 10к * 10к считался около часа...
|
|||
52
Ildarovich
28.11.16
✎
10:47
|
Самое интересное всегда - фактура задачи. Что за данные в матрице? И сколько их? - От этого будет зависеть метод.
Если все данные важны, то есть на результат должен влиять каждый элемент матрицы, то можно и МНК взять. Все равно время работы будет пропорционально числу элементов матрицы. Если же данные можно прореживать, то имеет смысл развить идею из (49) - выбирать много раз случайные три точки, а затем усреднять получаемые плоскости. |
|||
53
Garykom
гуру
28.11.16
✎
10:53
|
||||
54
Лодырь
28.11.16
✎
11:00
|
(52) Можно разбить на куски и посчитать среднее арифметическое на каждом куске. Дальше решать задачу апроксимации на полученном массиве меньшей размерности.
Согласен, что самое интересное - информация о контексте, которая у нас отсутствует. |
|||
55
vde69
28.11.16
✎
11:02
|
||||
56
wormselfish
28.11.16
✎
17:42
|
Короче сам придумал решение пока спал. Точнее под утро, когда уже почти проснулся, и голова отдохнула.
Итак, разделяем таблицу вертикально на две равные части: левая и правая. Считаем среднее арифметическое для каждой половины. Получаем две точки с координатами x,y в центрах этих половин, z у них равен средним арифметическим. Уже можно построить прямую проходящую через 2 точки. Аналогично разделяем таблицу но уже горизонтально, считаем среднее, находим центры, получаем еще две точки через которые можно построить еще одну прямую. В итоге имеем две пересекающиеся прямые через которые можно построить нужную плоскость. Причем у одной прямой координата X не меняется, а у другой не меняется Y, что еще больше мне нравится. Или проще говоря, по тем четырем половинам с их четырьмя центрами можно сразу строить плоскость проходящую через любые три точки из четырех. |
|||
57
Вафель
28.11.16
✎
17:51
|
А точно прямые пересекаются?
|
|||
58
wormselfish
28.11.16
✎
17:53
|
(57) Да
|
|||
59
Loky9
28.11.16
✎
20:28
|
(56) Скорее всего тут плоскость можно построить по паре-тройке сечений.
|
|||
60
Михаил Козлов
28.11.16
✎
20:57
|
(56) И какое отношение это имеет к исходной задаче?
В МНК хоть понятно, что делается. Я бы попробовал реализовать МНК, как положено (получится система линейных уравнений 3х3 (если F(x,y)=A*x+B*y+C), либо 2х2 (если F(x,y)=A*x+B*y)). Решение самой системы не трудоемко: основное время уйдет на вычисление коэффициентов матрицы и значений правых частей (навскидку будет пропорционально числу точек (N^2)). Если получится неприемлимо долго, можно попробовать "проредить" исходную матрицу (уменьшить размерность). |
|||
61
iceman2112
28.11.16
✎
20:58
|
(56) или у тебя с точками какой то условия. Но в 56 ты строишь дичь)
|
|||
62
wormselfish
28.11.16
✎
21:44
|
(60) N^2 не вариант вообще
(61) таки почему дичь? Если (56) не годится, то можно решать задачу влоб: уравнение плоскости z = A*x + B*y + C Если взять начало координат за центр таблицы, то плоскость будет проходить через точку 0, 0, Zсред. Zсред = среднее значение по всей таблице. получается C = Zсред! Осталось найти А и В. Из уравнения следует что Ax = z - By - C там где y=0, A = (z - C) / x, то есть просто считаем среднее значение для всех точек по формуле (z - C) / x, находим А. "В" находим по той же схеме: среднее от (z - C) / y Так как матрица симметричная, "x" и "y" в диапазоне -N/2 .. N/2, то -C/x и -C/y сокращается, нужно будет считать только среднее от z, z/x и z/y. Это можно сделать за один проход по массиву |
|||
63
vde69
28.11.16
✎
22:02
|
(62) конечно дичь, причем полная...
представь, в твою четверть попало 10 точек, из которых имеют значение от 9 до 10, и одна точка (дребезг измерения) имеет значение 10000, то есть у тебя будет средняя в районе 1000, хотя и дебилу понятно, что средняя должна быть где-то около 10... я множество подобных алгоритмов перерешал и на практике внедрил... и знаю о чем говорю... |
|||
64
Asmody
28.11.16
✎
22:03
|
(62) Я тебе еще проще решение скажу: бери три случайные точки и натягивай на них плоскость. Тебе ж похер на точность.
|
|||
65
vde69
28.11.16
✎
22:06
|
(63) +
вот например мой проект с апрксимацией http://arduino.ru/forum/proekty/kontroller-mufelnoi-pechi |
|||
66
wormselfish
28.11.16
✎
23:10
|
(63) То есть если например тебе платили 11 месяцев по 10 тысяч зарплату, и дали годовую премию 10 миллионов, то ты считаешь что в среднем зарабатываешь 10 тысяч в месяц? У тебя явно проблемы с математикой
|
|||
67
wormselfish
28.11.16
✎
23:11
|
(64) Вообще не годится.
|
|||
68
wormselfish
28.11.16
✎
23:14
|
(63) Попробуй реши свой пример по МНК, удивишься.
|
|||
69
vde69
28.11.16
✎
23:33
|
(66) я привел пример, что среднее далеко не всегда правильное решение...
пример есть ряд 8, 9, 8, 12, 10, 6, 50, 8, 10, 9 в моем примере (65) есть несколько путей решения например: отбрасываем 10% самых= больших и 10% самых маленьких значений, остальное считам по среднему, х = (8+9+8+12+10+8+10+9) / 8 = 10.25 |
|||
70
vde69
28.11.16
✎
23:53
|
(69) +
или еще вариант, строишь гистограмму по точкам 8, 9, 8, 12, 10, 6, 50, 8, 10, 9 потом считаешь площадь фигуры и делишь на 10 |
|||
71
Torquader
29.11.16
✎
00:23
|
Самое главное, что в реальности зависимость вообще может быть нелинейной, но её по привычке пытаются свести к линейной - конечно - что-то получится, но вот иногда ответ может быть совершенно неправильным.
|
|||
72
wormselfish
29.11.16
✎
00:51
|
(69) У тебя совсем другая задача. У меня случайные большие отклонения сильно ограничены, их можно не выискивать отдельно. И так как я считаю среднее арифметическое, а не квадратическое, то влияние выбросов еще меньше.
|
|||
73
SatansClaws
29.11.16
✎
05:48
|
(0) Нормально так.
Постановка задачи (именно в том виде, в котором озвучена) - это пара разделов вышки на 4-5 курсе мехмата/вычмата. Численные методы, разностные схемы, функциональный анализ - вот это все. И вы хотите, чтоб вам за 5 минут накидали УНИВЕРСАЛЬНЫЙ алгоритм? Ничего так, что студентов целый семестр учат составлять разностные схемы под конкретные граничные условия? И даже к концу семестра студентов, понявший суть - пара человек со всего курса. |
|||
74
Михаил Козлов
29.11.16
✎
10:50
|
(60)+. Можно попробовать "усреднение":
- разбиваем исходную матрицу на блоки, скажем 16х16 блоков; - в качестве "представителя" блока берем его центр тяжести (средние по x и y); - применяем МНК к задаче 16х16. Я бы попробовал, сравнивая отклонение для "усредненного" решения (для разного количества блоков) с отклонением для МНК в исходной задаче (4096х4096). |
|||
75
Йохохо
29.11.16
✎
11:10
|
(72) то есть у Вас есть модель измерений и их погрешностей, которой Вы не делитесь, но применяете. Это чтобы ни кто не предложил решения? в (56) бред, возьмите (74), но перед усреднением обязательно надо заменить большие выбросы. т.е. два прохода 1 убираем выбросы на блоке 2 усредняем блок
|
|||
76
Ildarovich
29.11.16
✎
11:22
|
(73) Универсальный алгоритм есть.
Это метод наименьших квадратов (МНК). Его трудоемкость будет не намного больше, чем "самый простой метод", приведенный в (56). Трудоемкость (56) также пропорциональна числу точек в матрице, как и МНК. В МНК для этой задачи вычислений чуточку больше, но больше на некоторый постоянный коэффициент. И такая же линейная (кажется) зависимость от числа точек (N^2) в матрице. Что смущает в методе (56). Фактически он решает другую задачу. Задачу не линейной, а кусочно-линейной ("ступенчатой") аппроксимации. То есть на плоскости определения функции определяюся четыре ступеньки (по числу квадрантов) и описанным методом определяется высота каждой ступеньки. То есть для того, чтобы ошибка аппроксимации была минимальной, найденные параметры должны использоваться как высоты ступенек такой нелинейной функции. Проводить через центры ступенек плоскость - значит увеличивать ошибку аппроксимации. Проще всего это увидеть для случая функции одной переменной: Вот такая функция v----^v----^ методом (56) будет аппроксимирована горизонтальной линией, а при использовании МНК - наклонной. Вот такая функция -----^v----- и такая v----------^ методом (56) будет аппроксимирована одинаково, а МНК - по-разному. Фактически, используя (56) мы игнорируем информацию о расположении точек внутри каждого квадрата, из-за чего точность линейной аппроксимации неизбежно снижается. Поэтому все же нужно поднапрячься и вывести не такие уж сложные формулы расчета коэффициентов А, B, С для этой задачи. Кажется, это не сложнее, чем обоснование в (62). Тогда же станет окончательно понятной вычислительная сложность. |
|||
77
ovrfox
29.11.16
✎
13:16
|
На самом деле задача легко сводится к линейной.
А именно т.к. у нас всегда элементы в матрице нумеруются с 1 по N, то то можно взять ряд от 1 до N в квадрате и присвоить каждому элементу массива соотвествующий номер. Итого имеем некоторую последовательность П(т) = Z(t) Далее по МНК получаем, что нужно минимизировать сумму (а*i+n*j+c - A(i,j))^2. Согласно МНК экстеремум функции достигается при первой производной равной нулю. Дифференцируем - получаем систему уравнений: a*n*(2(n+1)^3+(n+1)-3(n+1)^2)/6 +b*n^2*(n+1)^2/4+n^2*c = Сумма по i от 1 до n i*(Сумма по j a(i,j)) b*n*(2(n+1)^3+(n+1)-3(n+1)^2)/6 +a*n^2*(n+1)^2/4+n^2*c = Сумма по j от 1 до n j*(Сумма по i a(i,j)) a*n^2*(n+1)/2 + b*n^2*(n+1)/2 + n^2*c = сумма всех элементов матрицы Естественно такие уравнения получились потому, что в нашем случае x и y - это идентификаторы элементов матрицы. Как видим - мы получили три уравнения с тремя неизвестными, в которых мы легко можем посчитать правую часть за один проход, причем просто суммированием элементов. Назовем эти суммы (сократив на n^2) соотвественно Среднее(i), Среднее(j) и просто среднее - получим три линейных уравнения , которые можно решить простыми вычислениями. Причем к-во уравнений не зависит от N |
|||
78
Asmody
29.11.16
✎
13:19
|
(76) (77) Для ТС это слишком сложно. МНК не помещается в его голове.
|
|||
79
Это_mike
29.11.16
✎
13:31
|
(78)
- У тебя есть простой карандаш? -- Есть синий! - Не, мне нужен простой... -- А что, синий для тебя слишком сложный??? © |
|||
80
ovrfox
29.11.16
✎
13:34
|
(77) Извините, за один проход - это я загнул.
Но за два получится. Если за один - тогда одновременно считать сумму элементов текущего ряда и каждую и сумм столбцов в соотвествующий массив. Вероятно - так будет быстрее, с учетом размера матрицы. |
|||
81
Это_mike
29.11.16
✎
13:34
|
(76) прикол еще в том, что отдельных при усреднениях по горизонтали и по вертикали мы получим минимум две прямых , котрые могут и не пересекаться.а при усреднении по квадрантам - получим 4 точки, на которые совсем не обязательно ляжет плоскость
|
|||
82
ovrfox
29.11.16
✎
13:39
|
(81) Я еще добавлю, что усреднение по двум или четырем частям задача аналогичная по сложности МНК. Отличается только на константу - что быстрее - посчитать коэффициетты по четырем средним или решить систему трех линейных уравнений.
|
|||
83
Garykom
гуру
29.11.16
✎
13:42
|
ТС хочет "линейную" функцию, по сути аппроксимация поверхности плоскостью.
https://toster.ru/q/87470 |
|||
84
Это_mike
29.11.16
✎
13:43
|
(82) ну, вообще, можно усреднять рекурсией, спускаясь по квадратм... по идее, тогда сложность будет меньше квадратичной... хотя и усреднение будет "другое"
|
|||
85
ovrfox
29.11.16
✎
13:44
|
(83) в (77) уже решены первые три пункта совета
Осталось посчитать суммы и решить систему линейных уравнений |
|||
86
ovrfox
29.11.16
✎
13:50
|
(84) Решение, которое обращается ко всем элементам данных не может иметь сложность меньше, чем O(N), в нашем случае N -это к-во элементов матрицы, т.е. n^2.
Рекурсия, с передачей подобной области данных уже имеет другой, НЕ МЕНЬШИЙ , порядок сложности. Только отбрасывание данных (т.е. пропуск элементов) может уменьшить сложность задачи. И, как уже я писал, сложность линейная, а не квадратичная Для данной задачи квадратичная сложность, это O(N*N) = O(n^4) |
|||
87
Ildarovich
29.11.16
✎
13:54
|
(77) У меня получилось так:
solve a n m + b (n+1)n m/2 + c n(m+1)m/2 = p; a (n+1)n/2 + b (n(n+1(2n+1)/6)-1)m + c (n+1)n(m+1)m/4 = q; a (m+1)m/2 + b (n+1)n(m+1)m/4 + c (m(m+1)(2m+1)/6-1)n = s for a,b,c можно решить в общем виде. Здесь p = Сумма(Zij); q = Сумма(i * Zij); s = Сумма(j * Zij). |
|||
88
Ildarovich
29.11.16
✎
13:56
|
+(87) n - число строк, m - число столбцов в матрице
|
|||
89
ovrfox
29.11.16
✎
14:24
|
(87) Если под уравнением имеется в виду а*i+b*j+с - то не правильно, видимо a+b*x+c*y - но и тогда что-то не сходится
Кстати, в (77) - неправильное дифференцирование для функции a*i+b*j+c должно получиться такие ураdнения а*Сумма(квадратов i)/n+b(n+1)(m+1)/4+c(n+1)/2 = Сумма(i*Zij)/(m*n) a*(n+1)(m+1)/4+b*Сумма(квадратов j)/m+c*(m+1)/2 = Сумма(j*Zij)/(m*n) a/2*(n+1)+b/2*(m+1)+c = Сумма(Zij)/(m*n) |
|||
90
ovrfox
29.11.16
✎
14:29
|
Формула для суммы квадратов
Сумма квадратов от 1 до n это (2*(n+1)^3+n+1-3(n+1)^2)/6 Или ((n+1)^3+n^3+n+2)/6) |
|||
91
Ildarovich
29.11.16
✎
14:36
|
(89) У меня было а + i*b + j*c; Сумма(квадратов i) = n(n+1 )(2n+1)/6) - 1.
Сейчас понял, что в общем виде считать нет смысла, достаточно задать n = m = КонкретноеЗначение, получим числа, которые нужно подставить в решение ЛУ по формуле Крамера. Там вполне обозримые выражения, которые собственно и показывают, что к элементам матрицы приходится обращаться трижды, находя суммы с весом 1, с весом i и с весом j. То есть примерно в три раза больше время, чем усреднение в квадрантах (56). |
|||
92
Йохохо
29.11.16
✎
14:39
|
(81) всё еще хуже ) https://ru.wikipedia.org/wiki/Сапог_Шварца сходиться тоже надо уметь, потому в (56) и бред
|
|||
93
Ildarovich
29.11.16
✎
14:40
|
(90) ((n+1)^3+n^3+n+2)/6) = 6,5 при n = 2, а формулу из (91) я проверял
|
|||
94
ovrfox
29.11.16
✎
14:49
|
(93) Сорри - 2-й вариант не правильно упростил
Правильно : ((n+1)^3+n^3-2n-1)/6 |
|||
95
Ildarovich
29.11.16
✎
14:53
|
(94) Да, а у меня -1 был лишний. Так что уравнения одни и те же.
Думаю, это все, что было нужно. |
|||
96
Ildarovich
29.11.16
✎
14:56
|
+(52) +(95) ...а мы так и не узнали, в чем был смысл аппроксимации и был ли он вообще...
|
|||
97
Михаил Козлов
29.11.16
✎
15:53
|
(86) При "усреднении" по блокам экономия будет за счет меньшего числа умножений (число блоков х число блоков). А координаты "центра тяжести" в блоке - это сложения. Так что при "усреднении" число умножений меньше N^2.
|
|||
98
ovrfox
29.11.16
✎
16:11
|
(97) Не понимаю, о каком умножении речь?
А делений будет больше, а не меньше - рассчитать среднее в матрице это сложения и один раз деление. А по блокам - это нужно делать в каждом блоке и между блоками - число сложений незначительно больше, а число делений - значительно. Т.е. по блокам расчет будет более длительным. |
|||
99
Михаил Козлов
29.11.16
✎
16:42
|
(98) Давайте на одномерном примере. Пусть нужно построить одномерный тренд для 100 точек. Коэффициенты f(i) = a*i+b вычисляются так:
Процедура ВычислитьКоэффициентыТренда(Y, a, b) N = Y.Количество(); Sx = 0; Sy = 0; Sxy = 0; Sxx = 0; ДЛЯ i = 0 ПО N-1 Цикл Sx = Sx+i; Sy = Sy+Y[i]; Sxy = Sxy+Y[i]*i; Sxx = Sxx+i*i; КонецЦикла; b = (N*Sxy-Sx*Sy)/(N*Sxx-Sx*Sx); a = (Sy-b*Sx)/N; КонецПроцедуры Как видим, это O(N) умножений. Если разобъем на 10 блоков по 10 точек, то: - для усреднения в каждом блоке понадобится 10 сложений + 1 деление - итого 10 делений; - для вычисления тренда по усредненным - O(10) умножений. В крайнем случае (1 блок): - для усреднения - 100 сложений + 1 деление; - для тренда - 0 умножений. |
|||
100
olegves
29.11.16
✎
17:29
|
z=A(х+у), где а - коэффициент наклона прямой к плоскости координат х,у.
Т.к. ф-я линейна во всех направлениях, т.е. линия в 3-мерном пространстве, то она проходит через начало координат, а поскольку есть пары координат с одинаковыми индексами (х=1,у=1; х=10,у=10...), то проекция линии на плоскость ху - это биссектриса. Тебе остается взять любую координату в массиве и вычислить А=z/(х+у) |
|||
101
wormselfish
29.11.16
✎
17:35
|
(76) Да, есть такой недостаток в (56), поэтому я написал (62) в котором этого недостатка нет.
(77) Вычисления ты пишешь те же самые что я делаю в (62). (78) Ты выглядишь как гопник в компании интеллигентов )))) |
|||
102
wormselfish
29.11.16
✎
17:37
|
(81) >> прикол еще в том, что отдельных при усреднениях по горизонтали и по вертикали мы получим минимум две прямых , котрые могут и не пересекаться.
Только в твоих фантазиях. В реальной жизни они не могут не пересекаться. >> а при усреднении по квадрантам - получим 4 точки, на которые совсем не обязательно ляжет плоскость Не предлагай усреднять по квадратам. Этот способ крайне не верный. |
|||
103
wormselfish
29.11.16
✎
17:51
|
(79) Молодец! В тему
|
|||
104
ovrfox
29.11.16
✎
17:53
|
(99) Оценка сложность задачи определеяется кол-вом повторов в цикле вне зависимости от вычислений внутри цикла
В первом примере ты обращаешся к элементу 1 раз А во втором ты дельшь элементы по 10 а потом работаешь с сокращенной задачей. Итого оценка второго примера O(N)+O(N/10) явно больше оценки O(N) Что касается сложности вычислений внутри цикла, то я согласен, что для маленьких массивов( о которых речь НЕ идет) общее к-во умножений может вывести алгоритм назад, но в нашем случае, когда массив очень большой - накапливание даже одной сотой элементов в отдельном месте - основные потери будут именно на запись/чтение промежуточных результатов и к-во умножений (относительное ) не будет иметь значения. |
|||
105
wormselfish
29.11.16
✎
17:56
|
Сравнил результаты по МНК со своим методом. Оба решения дают приемлемый по значению результат. По скорости нужно очень много оптимизировать. Тормозит в любом случае не приемлемо.
|
|||
106
ovrfox
29.11.16
✎
17:57
|
(101) Ты ошибаешься, алгоритмы разные
Кроме того идея приведения 3-х мерной задачи к двумерной не выполнена, значит все вычисления ошибочны. Снимаю свое решение (77) и (87) |
|||
107
ovrfox
29.11.16
✎
17:58
|
(105) Заполни массив по формуле
f(i,j) = 5i+7j-12 Проверь свои методы, получаешь ли ты указанную плоскость? |
|||
108
Вафель
29.11.16
✎
18:02
|
(105) надеюсь не на 1с пишешь )))
|
|||
109
Михаил Козлов
29.11.16
✎
18:03
|
(104) "Итого оценка второго примера O(N)+O(N/10)" - а O(N) для умножений откуда взялось?
|
|||
110
Вафель
29.11.16
✎
18:16
|
O(N) = O(N/10)
|
|||
111
Garykom
гуру
29.11.16
✎
18:22
|
Интересно а автора не смущает что попытка перевести в математическую функцию в результате приведет к настоящим тормозам?
Если есть двумерный массив то почему данные в этом виде и не оставить, если там размеры не десятки миллионов х десятки миллионов. И при необходимости получить "высоту" для неких координат банально берем значения из массива слева и справа по X и по Y и высчитываем требуемое Z как среднее арифметическое... |
|||
112
Garykom
гуру
29.11.16
✎
18:24
|
(111)+ Не хочется хранить точки и хочется еще быстрее то у тебя же по сути "аппроксимация полигонами" и можно даже заюзать GPU
|
|||
113
wormselfish
29.11.16
✎
18:34
|
(111) Смущает, читай внимательно (0). Поэтому и ищу более быстрый вариант.
|
|||
114
Garykom
гуру
29.11.16
✎
18:46
|
(113) Гм а пробовал? Предвижу что взять 4 числа из массива и вычислить среднее шустрее чем все прочее ))
|
|||
115
Garykom
гуру
29.11.16
✎
18:48
|
F(x,y) = (Z(x-,y-)+Z(x-,y+)+Z(x+,y-)+Z(x+,y+))/4
|
|||
116
Garykom
гуру
29.11.16
✎
19:13
|
Кста задачка напоминает некий изврат похожий на распознавание/авторизацию по фейсу с камеры.
Причем распознавать/авторизовывать будет чип на карточке или даже симка в телефоне... |
|||
117
wormselfish
29.11.16
✎
19:21
|
(114) Среднее по 4096х4096 считать шустрее чем ax + by + c???
Ну ты математик! ))) |
|||
118
Garykom
гуру
29.11.16
✎
19:32
|
(117) Скажи прикидываешься или и правда не можешь смотреть чуть шире?
Зачем тебе "всего одна плоскость"? Когда можно более точно и намного более быстро для конкретной "пары координат" значение высоты получать? |
|||
119
wormselfish
29.11.16
✎
19:34
|
(118) По четырем соседним значением по-твоему более точно чем по всем?
Похоже ты не прикидываешься |
|||
120
Garykom
гуру
29.11.16
✎
19:35
|
(119) Мдя... Только не говори что автопилот для летающего чего то пишешь...
|
|||
121
Garykom
гуру
29.11.16
✎
19:36
|
(120)+ В курсе что "твоя плоскость" будет через горы насквозь проходить?
|
|||
122
wormselfish
29.11.16
✎
19:38
|
(121) КО, тебя что в этом смущает? Расскажи что у тебя в голове, а то вообще не по теме что-то пишешь.
|
|||
123
Garykom
гуру
29.11.16
✎
19:45
|
(122) Меня смущает практическое применение.
Если задача чисто теоретическая то есть или МНК или нечто вроде алгоритмов сжатия изображений с потерей информации. Когда последовательно уменьшаем количество точек до 4 оставшихся, берем группы и 4 точек и заменяем одной средней арифметической. По оставшимся 4 уж МНК. |
|||
124
Garykom
гуру
29.11.16
✎
19:46
|
(123)+ *группы из 4 точек
|
|||
125
Garykom
гуру
29.11.16
✎
19:48
|
был массив 4096Х4096, стал 2048Х2048, затем 1024х1024 и т.д. до 2х2
|
|||
126
wormselfish
29.11.16
✎
20:04
|
(125) У этого есть недостатки которые уже в теме обсуждались
|
|||
127
Йохохо
29.11.16
✎
21:48
|
(0) если у тебя есть общие соображения из физической модели - тупо выкинь ненужные точки. Оставь три матрицы доверительно достаточной размерности, усредни .. .. профит
|
|||
128
wormselfish
29.11.16
✎
22:25
|
(107) Проверил оба своих метода, плоскость получается та же самая.
|
|||
129
wormselfish
29.11.16
✎
22:28
|
(127) Да, уже было, в (56)
|
|||
130
NSSerg
29.11.16
✎
22:41
|
МНК еще не предлагали? Как верно выше было замечено, сложность МНК "О" большое от количества точек, при этом с небольшой константой, и естественно легко доказывается что меньшая сложность невозможна (просто на чтение точек потребуется такая сложность).
Что обсуждается уже вторую страницу ИМХО непонятно. |
|||
131
Garykom
гуру
29.11.16
✎
22:50
|
(130) Предлагали сразу же в (1) :)
|
|||
132
NSSerg
29.11.16
✎
22:53
|
(131) а что делали в остальных 130 постах?
|
|||
133
Garykom
гуру
29.11.16
✎
22:55
|
(132) Дурью маялись
|
|||
134
Garykom
гуру
29.11.16
✎
22:56
|
Вплоть до предложения взять 3 случайные точки с помощью ГЧС и по ним построить плоскость...
|
|||
135
Garykom
гуру
29.11.16
✎
22:56
|
(134) *ГСЧ
|
|||
136
rphosts
30.11.16
✎
01:06
|
(4) такие задачи на ассемблере не решали тогда, не решают и сейчас на 1с...
ну не нравится наименьшие квадраты, что-бы не сплайн-метод? |
|||
137
wormselfish
30.11.16
✎
01:22
|
Друзья, не паникуйте! Решения были найдены на предыдущей странице, целых два со своими плюсами и минусами. Сейчас ищем более лучшее решение и обсуждаем найденные.
|
|||
138
rphosts
30.11.16
✎
06:57
|
(137) >более лучшее
Великий и Могучий изучали не в Иваново? |
|||
139
wormselfish
30.11.16
✎
08:26
|
(138) Нет, троллей кормлю, которым не хватает знаний ни к чему придраться кроме как к правописанию )))
|
|||
140
rphosts
30.11.16
✎
11:38
|
(139) ну (0) показывает, что знаний не хватает у вас, а в (137) проблема отнюдь не в правописании
|
|||
141
wormselfish
30.11.16
✎
20:34
|
(140) Это может любой глупый тролль написать. А ты попробуй напиши что-то умное.
Вот например Ildarovich, ovrfox и еще двое других человек на предыдущей странице показали что разбираются в вопросе, молодцы. |
|||
142
wormselfish
30.11.16
✎
20:36
|
(140) Ты придрался к слову "правописание". Я знал что так будет, и специально его написал.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |