powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Можно ли на SQL реализовать линейную регрессию?
25 сообщений из 106, страница 1 из 5
Можно ли на SQL реализовать линейную регрессию?
    #40045139
Иван FXS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дано: вектор Y находится в таблице [Ytable] с полями [i] (целое) и [y] (действительное);

N векторов Xn находятся в таблице [Xtable] с полями [n] (целое), [i] (целое) и [x] (действительное);

i принимает значения от 1 до 10000, n -- от 1 до 100 (то есть в таблице [Xtable] 100*10000 = миллион записей).

Можно ли написать SQL-запрос, который помещает в таблицу [Atable] коэффициенты линейной регрессии вектора Y на вектора Xn?

(пост связан с постом https://www.sql.ru/forum/1333430/vopros-o-shodimosti-psevdoregressii )
...
Рейтинг: 0 / 0
Можно ли на SQL реализовать линейную регрессию?
    #40045163
Фотография vikkiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Иван FXS,

Полно в разных базах данных либо готовых функций либо необходимые чтобы собрать в необходимое решение, например:

Hive:
regr_r2()
regr_slope()
regr_intercept()
sum()
count()
avg()
variance()
stddev_pop()

T-SQL
AVG()
SUM()
COUNT()
VAR()
STDEV()

DAX
COUNT( )
AVERAGE( )
STDEV.P( )
VAR.P( )
SUM( )


MDX (в MDX так-же есть поддержка VBA функций)
LINREGINTERCEPT()
CORRELATION()
COVARIANCE()
LINREGSLOPE()
AVG()
...COUNT
LINREGR2()
STDDEV()
SUM()
VAR()


Кроме всего многие базы данных поддерживают интеграцию с внешними библиотеками а так-же родные процедуры работы с ML компонентами (например R или Python )..
...
Рейтинг: 0 / 0
Можно ли на SQL реализовать линейную регрессию?
    #40045168
Иван FXS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vikkiv, это я понимаю, меня интересует именно "можно ли написать SQL-запрос" (а не вызвать внешнюю -- для SQL -- функцию).

Ну и линейная регрессия -- это всё-таки не AVG(), SUM(), COUNT(), VAR() или STDEV()... немножко посложнее.
...
Рейтинг: 0 / 0
Можно ли на SQL реализовать линейную регрессию?
    #40045219
Фотография vikkiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Иван FXS,

Чуть чаем не подавился.. мы точно об одной регрессии говорим?
Или в школах какой-то альтернативный математический прогресс пошел?
Насколько я помню именно наличие этих функций является вполне достаточным
условием для нахождения коэффициентов простой линейной регрессии,
(кроме стандартных/основных {арифметических} алгебраических операций:
сложения, вычитания, умножения и деления, и можно чисто с бюрократической
точки зрения добавить операции со степенями и функцию power())

для множественной (многофакторной) немного замороченнее, но тоже вычисляемо

был вопрос - можно-ли.. соответственно дан ответ: можно, и показано направление,
причём на HIVE SQL и некоторых др. диалектах есть готовые функции

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

Есть же библиотеки оптимизированные на векторную/линейную алгебру, GPU,
расширенные инструкции, дополнительные регистры, параллельность,
многопоточность по всем ядрам и CPU, даже на кластерах через тот-же Spark например..
одни MKL/BLAS + AVX512 чего только стоят по производительности на задачах этого класса,

Python или R в руки и вперёд, уже довольно давно принятый в корпоративном мире стандарт.

но если сильно хочется то напр. на T-SQL набросать можно что-то такое:
(заметь: именно sum/count/avg/var)
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
declare @ax float,@ay float,@v float,@a float,@b float,@c float
declare @t table(x float,y float)
insert into @t values
(1,12.57759),
(1,12.62543),
(12,95.44029),
(17,128.85693),
(7,58.13482),
(6,48.73899),
(18,138.2968),
(19,150.30743),
(1,12.17612),
(9,73.3948),
(2,19.23263),
(16,121.92411),
(9,69.01374),
(20,151.68242),
(3,27.79543)
select @ax=avg(x),@ay=avg(y),@v=varp(x),@c=count(1) from @t -- avg(x),avg(y),var(x),n=count()
select @b=sum((@ax-x)*(@ay-y))/(@v*@c) from @t -- slope = cov(X,Y)/var(X)
select @a=@ay-@b*@ax -- intercept
select @a a, @b b -- regression coefficients



С MySQL тоже схожая ситуация как и с MSSQL,

в PostgreSQL и Oracle как и в HIVE ещё есть готовые
regr_intercept()/regr_slope()/regr_r2() ,
плюс дополнительные суммы квадратов, ковариации, корреляции и т.д.
...
Рейтинг: 0 / 0
Можно ли на SQL реализовать линейную регрессию?
    #40045226
Иван FXS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vikkiv
для множественной (многофакторной) немного замороченнее, но тоже вычисляемо


--но вы видите что в посте идёт речь именно о "множественной (многофакторной)" или нет? И даже количество факторов указано -- 100. То, что регрессия переменной Y на ОДНУ переменную Х конструируется ... как два пальца об асфальт, я знаю.
...
Рейтинг: 0 / 0
Можно ли на SQL реализовать линейную регрессию?
    #40045229
Фотография vikkiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Иван FXS,

технически, если вдаваться в семантику - то это не было указанно в явном виде / или я не понял
(может только если отследить по другой теме и придти к такому выводу),
т.к. там нет детерминированности и возможны варианты интерпретации,
но в виде как указанно в последнем сообщении - эта неопределённость уходит

теперь собственно к ответу на тему по множественной:
для частных случаев где n в пределах малых чисел (даже скорее цифр: 2,3...) - тоже вполне можно жестко прописать
и на SQL, для общей формы где n = произвольное - уже надо писать более замороченную логику генерации выражений
под вычисления с использованием циклов/рекурсий, промежуточных таблиц через динамический SQL,
что потребует намного больших трудозатрат, появятся проблемы с отловом ошибок и обслуживанием
так-же и появятся претензии к производительности (особенно большая чуствительность с ростом n чем при увеличении кол-ва строк)

(не отвечая на не заданный вопрос "нужно-ли это" с учётом наличия более оптимальных средств/языков
{процедурно/объектного программирования с нужным набором функций}
специально предназначенных для таких типов задач)
...
Рейтинг: 0 / 0
Можно ли на SQL реализовать линейную регрессию?
    #40045231
exp98
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
UNION в цикле наверное потянет. Но для этого динамический SQL не требуется. Достаточно простого PL/SQL, и в нём реализовать рекуррентность из того самого поста. Но это ИМХО.
Согласен, что обслуживать сложно. По трудозатратам вполне сравнимо с алгоритмикой. Если ради эстетства. Я один раз так и сделал: алгоритмическое ТЗ реализовал чередой запросов, но меня мотивировало, что ТЗ было размытым и опасался, что курочить алгоритм придётся многажды. Но курочить оказалось только эпилог. Так что не знаю, выиграл или проиграл. Под 1000 строк вышло.
...
Рейтинг: 0 / 0
Можно ли на SQL реализовать линейную регрессию?
    #40045444
exp98
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
(порезал про зависимость векторов)
Коль скоро озвучены порядки задачи. Видим же, что размерность векторного пр-ва и кол-во векторов несопоставимо. Не знаю уж как возникают эти векторы. При заметной случайности очевидно, векторы будут сильно не ортогональны.
Матрица ковариаций всего лишь 100х100. Такую задачу, если она изолированная, просто решить типовыми методоми. Например Главных компонент. Собственные значения и собс-ные векторы легко находятся школьными методами. Например модифицированным гауссом или корнями 100-полинома. Полином считается итерационно спец методом для таких матриц (для симметричных). Ничего запредельного в размерности 100 кроме обеспечения точности.
Но даже и это можно запихнуть в SQL-ы, только я бы не стал.

Конечно есть нюанс, если данная матрица представляет только однну реализацию однотипной послед-сти действий. Тогда может понадобиться обеспечить устойчивость решения. И тогда метод редукции регрессии к 2-мерным регрессиям вполне оправдано. Только получение коэф-тов нужно обеспечить устойчивым методом, иначе в разнос пойдёт. Про желаемый же метод этого (устойчивость) не знаю.
...
Рейтинг: 0 / 0
Можно ли на SQL реализовать линейную регрессию?
    #40045518
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Правильно ли я понял. Речь идет об этом https://ru.wikipedia.org/wiki/Линейная_регрессия

Код: sql
1.
2.
3.
4.
5.
Input:
(x1,y1),(x2,y2)......

Output
y=kx + b



На вход - координаты измерений в декартовой плоскости. На выходе прямая которая удовлетворяет требованию
близости одновременно ко всему множеству измерений.

По сути прямая здесь обозначена двумя вещественными коэфициентиками (k) и (b).

Верно?
...
Рейтинг: 0 / 0
Можно ли на SQL реализовать линейную регрессию?
    #40045551
Иван FXS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,

y(i) = b0(i) + b1*x1(i) + ... + bj*xj(i) + ... + bk*xk(i) + e(i)

-- на той же странице Википедии в разделе "Парная и множественная регрессия"
...
Рейтинг: 0 / 0
Можно ли на SQL реализовать линейную регрессию?
    #40045554
exp98
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
...По сути прямая здесь обозначена двумя вещественными коэфициентиками (k) и (b).
Верно?
Представть, что (k) и (b) векторы, пр-во до 10000-мерно, и |correl(b, Y)|-->min. По сути (b) - декоррелированный остаток. Надо приблизить (предсказать) некий вектор Y линейной ф-цией от (x). Как бы ряд Тейлора, где формула для Y неизвестна.

В данной задаче даже не идёт речь о последовательности случайных величин (векторов).
...
Рейтинг: 0 / 0
Можно ли на SQL реализовать линейную регрессию?
    #40045558
exp98
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пример Метода Леверье.
...
Рейтинг: 0 / 0
Можно ли на SQL реализовать линейную регрессию?
    #40045560
exp98
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Предыдущее было для выч хар. полинома.
Щас пример : корни полинома с действит-ми коэфф-ми. Метод Лагера.
...
Рейтинг: 0 / 0
Можно ли на SQL реализовать линейную регрессию?
    #40045576
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Технически, наверное не сложно портировать Basic на PL/SQL, или T/SQL.

Но автор хотел решить задачу следующим подходом:

Код: sql
1.
SELECT ..... FROM ..... Ytable, .... Xtable;



и возвращать представление таблицы ATable.

Что в этой задаче плохо? В ней плох формат исходных даных. А именно матрица 100*10000.
И ее декартов порядок. Обычно реляционные СУБД плохо работают с матрицами.

Готов спорить на виски, что реализация этого метода на PL/SQL + Collections будет на порядок эффективнее
чем любая реализация которая будет считывать данные непосредственно
из таблиц Ytable/Xtable в процессе самого расчета ЛР.

Разумеется я предполагаю что коллекции будут инициализированы из таблиц Ytable/Xtable будут как минимум 1 раз.

Кстати я предполагаю дать фору. И изменить структуру данных таким образом чтобы Ytable/Xtable были уже соединены
в отдельную материализацию.
...
Рейтинг: 0 / 0
Можно ли на SQL реализовать линейную регрессию?
    #40045581
exp98
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИМХО загвоздка в переменной n. Это кол-во полей (векторов Х). Лично я не знаю как это сделать даже с With abcde AS(). М.б. динамическим SQL. Но я не сильно спец, поэтому предполагал в виде (непонятно только , зачем?), где единственный оператор PL/SQL - это FOR

FOR k in 2..n
... курсоры
... курсоры

SELECT ..... UNION
SELECT .....
END

Кстати, в оракуле есть матричные функции, подразумевающие представление таблицы в стандартном массиве, где одно из полей есть номер поля таблицы (или имя этого поля, не помню без словаря) . Короче, ширина массива предзадана.
...
Рейтинг: 0 / 0
Можно ли на SQL реализовать линейную регрессию?
    #40045596
exp98
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
exp98
ИМХО загвоздка в переменной n. Это кол-во полей (векторов Х). ..... предполагал в виде (непонятно только , зачем?), где единственный оператор PL/SQL - это FOR
Не, вряд ли, наверное ещё один вложенный цикл, по координатам векторов. Алгоритм же рекуррентный по координатм, про поля тогда не думал.
...
Рейтинг: 0 / 0
Можно ли на SQL реализовать линейную регрессию?
    #40045600
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В рамках пятничного хакатона можно было-бы сделать нечто оригинальное на языках Stored Precedures.
Это и быстро-бы летало. И практично.

А чистый SQL... ну... похоже на тестовое задание. Но уж сильно специфичное.

Да и кому нужен чистый SQL? Это - утопия. Ни в одной конторе не требуют. Всегда предупреждают-де у нас - такой-то
софт (MSSQL/Postgres e.t.c.) и под него мы разрабатываем.
...
Рейтинг: 0 / 0
Можно ли на SQL реализовать линейную регрессию?
    #40045603
Иван FXS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В принципе, формулируя вопрос, я интуитивно предполагал, что это невозможно. И хотел получить подтверждение этому.
...
Рейтинг: 0 / 0
Можно ли на SQL реализовать линейную регрессию?
    #40045606
Фотография vikkiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Иван FXS,

Это не невозможно, очень даже возможно, это попросту непрактично,
поэтому и была череда намёков про сову на глобус .. кактус.
...
Рейтинг: 0 / 0
Можно ли на SQL реализовать линейную регрессию?
    #40045607
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Почему невозможно? Лет 15 назад в Oracle мы доказывали что SQL-полный по Тьюрингу. Это значит
что мы можем решать на нём любые задачи. Шахматы. Численные методы. Реализовывать машины
с состояниями.

Но из этого не следует что нам будет легко! Нам надо будет освоить хитрую технику... ну я не знаю
наподобие разворота цикла в рекурсию (как делают например в Haskell) чтобы протащить состояние
машины через итерации например.

Ну вобщем наверное можно. Но цена такого доказательства будет слишком дорогой.
...
Рейтинг: 0 / 0
Можно ли на SQL реализовать линейную регрессию?
    #40045630
Иван FXS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
SQL-полный по Тьюрингу.
-- утверждаете ли вы, что один SQL-запрос -- SQL ограниченный "рамками" одного запроса -- является полным по Тьюрингу?

Или что "программа", состоящая из набора последовательно выполняемых SQL-запросов (запускаемых, например, макросом) является полной по Тьюрингу?
...
Рейтинг: 0 / 0
Можно ли на SQL реализовать линейную регрессию?
    #40045636
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я пытаюсь вспомнить события тех лет.

Кажется речь шла о рекурсивных запросах.
...
Рейтинг: 0 / 0
Можно ли на SQL реализовать линейную регрессию?
    #40046067
Иван FXS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати о птичках. Эта задачка всплыла у меня в связи с идеей пощупать "корреляционную матрицу" (читай "регрессионную") для американского рынка акций -- если вдруг кому-нибудь эта тема интересна...
...
Рейтинг: 0 / 0
Можно ли на SQL реализовать линейную регрессию?
    #40046091
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Иван FXS
пощупать "корреляционную матрицу" (читай "регрессионную") для американского рынка акций -- если вдруг кому-нибудь эта тема интересна...

Сомневаюсь что нынешний рынок акций поддается хоть какому-то тех.анализу. Туда идет огромный поток свеженапечатанных баксов, поэтому его колбасит то от твитов Маска, то от троллинга с реддита и т.д. и т.п.
...
Рейтинг: 0 / 0
Можно ли на SQL реализовать линейную регрессию?
    #40046117
Иван FXS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T,

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

А правительства в самом деле печатают много денег. От этого рынок акций просто "системно" растёт как целое. И будет дальше расти.

Я бы понял, если бы вы произнесли коронный аргумент "от рефлексивности рынка": типа, там очень много богатых ребят, которые нанимают умных ребят, и если бы там были возможности для теханализа, то умные ребята их бы давно нашли, а богатые ребята на них уселись бы и тем самым "исчерпали" бы их... А так -- ну, баксов много поступает, ну колбасит его (да и так ли уж колбасит-то) ... ну и что?
...
Рейтинг: 0 / 0
25 сообщений из 106, страница 1 из 5
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Можно ли на SQL реализовать линейную регрессию?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]