powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Нечеткое группирование чисел
12 сообщений из 12, страница 1 из 1
Нечеткое группирование чисел
    #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
Нечеткое группирование чисел
    #40038801
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Задача кластеризации на SQL? боюсь, решение будет далеко от оптимальности...
...
Рейтинг: 0 / 0
Нечеткое группирование чисел
    #40038804
Фотография Критик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexander Us,

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

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

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

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

Не уверен, что это будет иметь хорошую производительность, просто первое что пришло в голову.
...
Рейтинг: 0 / 0
Нечеткое группирование чисел
    #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
Нечеткое группирование чисел
    #40038982
Alexander Us
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ennor Tiegael,
спасибо, почитаю

spenov,
Спасибо, иммено так и сделал - через размер окрестности.
...
Рейтинг: 0 / 0
Нечеткое группирование чисел
    #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
Нечеткое группирование чисел
    #40039098
Alexander Us
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akina,

спасибо!
...
Рейтинг: 0 / 0
Нечеткое группирование чисел
    #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
Нечеткое группирование чисел
    #40039108
L_argo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я бы написал функцию, возвращающую некий номер "кластера" (алгоритм попадания в кластер - на усмотрение афтара) и поставил эту ф-цию в group by.
Быстро не будет, но вполне гибко и работоспособно. И просто.
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Нечеткое группирование чисел
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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