Форум программистов, компьютерный форум, киберфорум
Алгоритмы
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
Эксперт по компьютерным сетям
4366 / 1694 / 342
Регистрация: 23.06.2009
Сообщений: 6,009

Выравнивание линий (не знаю как точней назвать, подробности внутри)

02.06.2023, 10:08. Показов 820. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго дня форумчане.

Даже не знаю как назвать задачу, опишу что есть и что хочется.

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

рис 1 - исходные данные, рис 2 те же данные только с границами интервала измерений, само значение "точки" получено как среднее арифметическое результатов измерений, в скобках количество измерений. Там где нет скобок, значения получены по данным прямой проходящей между двумя соседними точками.

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

по отдельной линии:
- значение точки справа должно быть меньше значения точки слева
- линия должна быть приближена к прямой, в идеале это показательная функция
- значения после корректировки должно находится в пределах интервала измерений
- минимально должны изменяться точки с бОльшим количеством измерений
- точки с единичным измерением (1) могут считаться не достоверными, их можно изменять как угодно
- есть такие измерения, в которых скажем более 2 измерений к примеру 5 или 6, но интервал этих измерений относительно небольшой, такие измерения тоже можно считать как не достоверные, это как к примеру 6 человек произвели измерения одного и того же события, но в силу погрешности измерительных инструментов получили разные значения близкие друг к другу

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

в результате должно получится нечто подобное


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

сейчас это происходит так, ищутся все линии которые не соответствуют условиям "отдельной линии", производится ее корректировка

после того как все линии соответствуют условиям, ищутся наборы линий которые не соответствуют условиям "по совокупности линий" и производится вручную корректировка.

Задача по максимальному автоматизировать весь этот процесс, ЯП планируется php, ну на крайний случай python (привет копи/паст)

Даже не знаю в какую сторону мне двигаться, какие применить алгоритмы, методики и т.д.

Может у кого есть какие мысли или опыт, подскажите pls.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
02.06.2023, 10:08
Ответы с готовыми решениями:

Не знаю как назвать, всё внутри
Можно ли както сделать такой же функционал, но на js, код на написан в паскале?: procedure Form1.button1_Click(sender: Object; e:...

Не знаю как назвать
Как сделать что бы программа 1не высвечивалась в трее и в строке около пуска 2не закрывалась кнопками alt+f4 3не отображалась в...

Не знаю как назвать
Подскажите пожалуйста, где здесь ошибка? Пытался скомпилировать в Microsoft Visual C++ (2010) Нажал на кнопку Run, а там ошибка, ну...

4
698 / 572 / 75
Регистрация: 20.09.2014
Сообщений: 3,700
03.06.2023, 05:20
Вообще это называют аппроксимацией, но в вашем случае это выглядит как спекуляция данными)
Поскольку идеалом является показательная функция, то задача сводится к поиску неизвестных параметров a1 < a2 < a3 < a4 < a5 < a6 (для каждого набора данных), таких что

https://www.cyberforum.ru/cgi-bin/latex.cgi?\sum |y-a^x| = min,
где y - это фактические измерения (каждый повтор считать как отдельное измерение).
Перебираем значения a, находим минимальную сумму, ответом будет a, а линию можно построить графиком:
https://www.cyberforum.ru/cgi-bin/latex.cgi?y = a^x
0
Windows must die
667 / 840 / 102
Регистрация: 23.11.2021
Сообщений: 4,893
Записей в блоге: 15
03.06.2023, 09:01
.None, для начала можно скользящую медиану попробовать, а потом уже подумать о частотном анализе или всяких Калманах...
0
698 / 572 / 75
Регистрация: 20.09.2014
Сообщений: 3,700
03.06.2023, 10:27
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
 
# Исходные данные
data = [(2023, 2433000, 2), (2022, 3466667, 3), (2021, 3329500, 4), (2020, 1650000, 1)]
 
# Поиск наилучшего значения показательной функции
coef = 0.5
Smin = np.inf
for a in np.arange(1.0050, 1.0100, 0.00001):
    S = 0.0
    for point in data:
        x = point[0]
        y = point[1]
        n = point[2]
        S += n * (np.abs(y - a ** x)) ** coef
    if S < Smin:
        Smin = S
        a_best = a
print(Smin)
print(a_best)
 
# Подготовка данных
x = []
y = []
y_approx = []
for point in data:
    x.append(point[0])
    y.append(point[1])
    y_approx.append(a_best ** point[0])
print(x)
print(y)
print(y_approx)
 
# Построение графиков
plt.plot(x, y)
plt.plot(x, y_approx)
plt.xlim(2023, 2020)
plt.show()
Добавлено через 17 минут
Ваша спекуляция с данными немного происходит по-другому. Вы берете две средние точки за основу и через них проводите что-то типа показательной функции. Фактически вы убираете выбросы (outliers). Удалите их вручную из data.

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
data1 = [(2022, 3466667, 3), (2021, 3329500, 4)]
 
coef = 2.0
Smin = np.inf
for a in np.arange(1.0050, 1.0100, 0.000001):
    S = 0.0
    for point in data1:
        x = point[0]
        y = point[1]
        n = point[2]
        S += n * (np.abs(y - a ** x)) ** coef
    if S < Smin:
        Smin = S
        a_best = a
print(Smin)
print(a_best)
Находим a_best для data1, но подготавливаем и строим графики для данных с выбросами data.

coef - коэффициент где-то от 0.5 до 2.0, который позволяет регулировать процесс оптимизации.

Добавлено через 3 минуты
Кстати, аппроксимировать прямой посложнее, так как требуется найти два коэффициента k и b в уравнении y=k*x+b. Такой алгоритм подбора называется линейной регрессией. Но можно, конечно и в лоб перебрать по двумерной сетке...
0
Эксперт по компьютерным сетям
4366 / 1694 / 342
Регистрация: 23.06.2009
Сообщений: 6,009
06.06.2023, 14:30  [ТС]
Цитата Сообщение от Mikhaylo Посмотреть сообщение
вашем случае это выглядит как спекуляция данными)
нет, это не спекуляция , хотя может так показаться

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

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

Больше интересовал вопрос по второй "фазе" корректировки, как разместить лини так, чтобы они соответствовали порядку, при этом что бы меньше всего изменялись положения точек/линий у которых большее количество измерений, у них как бы большая достоверность, больший вес у этих значений.

Сейчас происходит примерно так, ищу 2-3 линии у которых максимальное количество измерений, проверяю их порядок, при необходимости корректирую всю линию или ее часть, так чтобы при этом соблюдалось "первое правило", и по возможности данные были в пределах диапазона, когда все ок, беру остальные линии по убыванию количества измерений проверяю и расставляю относительно этих первых "базовых" линий, так чтобы сохранялся порядок и "первое правило", и все это руками

Цитата Сообщение от Mikhaylo Посмотреть сообщение
Находим a_best для data1, но подготавливаем и строим графики для данных с выбросами data.
спасибо, попробую на практике ваш код.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
06.06.2023, 14:30
Помогаю со студенческими работами здесь

не знаю как назвать
Вот, что мне подумалось, поведение Яндекса можно объяснить желанием простимулировать развитие рунета, иначе я (возможно в силу своей...

Даже не знаю как назвать:)
Здраствуйте уважаемые форумчане собствено назрел такой вопрос. private void button1_Click(object sender, EventArgs e) ...

Не знаю как это назвать+)
Вообщем так. У меня есть сайт ему 4 месяца. Захожу в Яндекс в строку поиска ввожу название своего сайта (имя.ru) и там появл. мой сайт и...

Даже не знаю как назвать )
Тype Person =Record Name: string; age: 1..200 end; list= file of person; Процедура Youngest (var spisok: list)... Вашей программы печает...

подскажите, не знаю как назвать
Подскажите пожалуйста как в wpf сделать чтобы по нажатию, например, первой кнопки в главном окне появлялись одни контролы, по нажатию...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит переходные токи и напряжения на элементах схемы. . . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru