Гость
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Нечеткое группирование чисел / 12 сообщений из 12, страница 1 из 1
25.01.2021, 19:30
    #40038793
Alexander Us
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нечеткое группирование чисел
Есть некие изменения, значения которых гнездятся с небольшими отклонениями около неких узловых значений.
Узловые значения заранее неизвестны.
Есть ли способ сгруппировать эти изменения?
Из данных, приведённых ниже, должно получиться 3 группы.
Заранее спасибо откликнувшимся.

Код: sql
1.
2.
3.
4.
5.
6.
create table #T(C1 float)
insert #T 
values
 (0.98),(0.99),(1.01),(1.07) --Группа 1
,(1.93),(1.95),(1.96),(2.11) --Группа 2
,(2.89),(3.00),(3.05),(3.55) --Группа 3
...
Рейтинг: 0 / 0
25.01.2021, 20:43
    #40038801
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нечеткое группирование чисел
Задача кластеризации на SQL? боюсь, решение будет далеко от оптимальности...
...
Рейтинг: 0 / 0
25.01.2021, 20:50
    #40038804
Критик
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нечеткое группирование чисел
Alexander Us,

пронумеруйте группы по 4 числа (от 1 до 3),
вы ведь такой алгоритм хотели?
...
Рейтинг: 0 / 0
25.01.2021, 21:52
    #40038812
Alexander Us
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нечеткое группирование чисел
Критик,

Нет, это просто пример.
В группе может быть разное/случайное количество значений.
Значения групп рапположены довольно кучно.
Т.е. расстояние между группами значительно больше расстояний между значениями в группе.
...
Рейтинг: 0 / 0
25.01.2021, 21:54
    #40038813
Alexander Us
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нечеткое группирование чисел
Akina
... Задача кластеризации на SQL? ...

Т.е. это называется кластеризацией?
Спасибо, загуглю.
...
Рейтинг: 0 / 0
26.01.2021, 09:25
    #40038867
Ennor Tiegael
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нечеткое группирование чисел
Alexander Us,

Заодно погуглите, что такое дерево Селко (Celko tree).

Не уверен, что это будет иметь хорошую производительность, просто первое что пришло в голову.
...
Рейтинг: 0 / 0
26.01.2021, 12:56
    #40038962
spenov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нечеткое группирование чисел
а если так?
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
drop table if exists #t
create table #T(C float)
insert #T 
values
 (0.98),(0.99),(1.01),(1.07) --Группа 1
,(1.93),(1.95),(1.96),(2.11) --Группа 2
,(2.89),(3.00),(3.05),(3.55) --Группа 3

;
with d as (
   select t1.c as c1, t2.c as c2,
            dense_rank( ) over (order by t1.c) as g
     from #t t1 cross join #t t2
     where abs(t1.c-t2.c)<=0.78 --максимальный размер окрестности
) 
select c2, g
  from d as t
  where exists(select *
                 from d
		 where g=t.g
		 group by g
		 having min(c2)=t.c1)
...
Рейтинг: 0 / 0
26.01.2021, 13:35
    #40038982
Alexander Us
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нечеткое группирование чисел
Ennor Tiegael,
спасибо, почитаю

spenov,
Спасибо, иммено так и сделал - через размер окрестности.
...
Рейтинг: 0 / 0
26.01.2021, 16:12
    #40039046
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нечеткое группирование чисел
Попробовал составить запрос с автоматическим определением "зазора" между группами, в предположении, что в данных нет "одиноко стоящих деревьев".

Вот fiddle .

сам запрос
Код: sql
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.
WITH 
cte1 AS (
SELECT DISTINCT val - LAG(val) OVER (ORDER BY val) delta
FROM test
),
cte2 AS (
SELECT test.val, 
       cte1.delta,
       CASE WHEN LEAD(test.val) OVER (PARTITION BY cte1.delta ORDER BY test.val) - test.val > cte1.delta
            THEN 1
            ELSE 0 END new_group
FROM test
CROSS JOIN cte1
WHERE cte1.delta IS NOT NULL
),
cte3 AS (
SELECT *, 
       new_group * LEAD(new_group) OVER (PARTITION BY delta ORDER BY val) single_group
FROM cte2
),
cte4 AS (
SELECT *, SUM(single_group) OVER (PARTITION BY delta) single_groups
FROM cte3
),
cte5 AS (
SELECT CAST(MIN(delta) AS DECIMAL(10,2)) gap
FROM cte4
WHERE single_groups = 0
),
cte6 AS (
SELECT test.val,
       CASE WHEN test.val - LAG(test.val) OVER (ORDER BY test.val) > cte5.gap
            THEN 1
            ELSE 0 END new_group
FROM test
CROSS JOIN cte5
)
SELECT val, SUM(new_group) OVER (ORDER BY val) group_number
FROM cte6
WHERE val < 1000



Там в общем все шаги более-менее описаны. Для корректной работы необходимо в набор данных добавить запись со значением, заведомо больше максимального значения (я добавил 1000, прямо в таблицу). Оптимизации, конечно, никакой.
...
Рейтинг: 0 / 0
26.01.2021, 18:48
    #40039098
Alexander Us
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нечеткое группирование чисел
Akina,

спасибо!
...
Рейтинг: 0 / 0
26.01.2021, 19:09
    #40039103
Владислав Колосов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нечеткое группирование чисел
Alexander Us,

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
drop table if exists #t;

create table #T(C float, n int default (0));

insert #T  (c)
values
 (0.98),(0.99),(1.01),(1.07) --Группа 1
,(1.93),(1.95),(1.96),(2.11) --Группа 2
,(2.89),(3.00),(3.05),(3.55); --Группа 3

declare @n int = 1,
	@gap float = 0.7;

with cte1 as
(
SELECT C, LEAD(C,1) OVER(ORDER BY C) C1, n,
	iif( LEAD(C,1) OVER(ORDER BY C) - C > @gap, cast(1 as int), cast(0 as int)) overlap
FROM #T
)
update #T set @n = #t.n = @n + cte1.overlap
from cte1 
where cte1.c = #t.c;

select * from #T;



PS Кривовато, границу не в тот набор пишет. Доработать не сложно, на LAG изменить.
...
Рейтинг: 0 / 0
26.01.2021, 19:41
    #40039108
L_argo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нечеткое группирование чисел
Я бы написал функцию, возвращающую некий номер "кластера" (алгоритм попадания в кластер - на усмотрение афтара) и поставил эту ф-цию в group by.
Быстро не будет, но вполне гибко и работоспособно. И просто.
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Нечеткое группирование чисел / 12 сообщений из 12, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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