Диалектика данных или сказка для взрослых
Caution
или-были данные. Многие пытались их посчитать, но не многим это удавалось. Каждый раз это происходило против их воли, их нормировали, прореживали и подвергали другими гнусными занятиями. Конечно же, они чувствовали это, но были не в силах этому помешать. А как же им хотелось посчитать себя самим. Один раз и навсегда. И жить долго и счастливо в детерминированном единстве своего существа.
from druhg import DRUHG dr = DRUHG() dr.fit(your_dataset) dr.minimum_spanning_tree_.plot() dr.labels_ # -1 are outliers # enjoy
DRUHG — Диалектический Ранговый Универсальный Группировщик
Note
Приступим.
Субъект
“Глазами” К |
“Глазами” L |
---|---|
Если K будет считать ближних к себе, то получится так.
|
Если же L начнёт считать от себя, то:
|
Субъект K считает от себя |
Субъект L считает от себя |
Ранг 2 |
Ранг 3 |
Диалектика
Объективная относительность. r · D² · √1+M/M
- Количество: чем меньше ранг, тем первичней отношение\(r\) — чужой ранг (\(r >= R\))
- Качество: чем ближе, тем первичней.\(D_r\) — своё расстояние чужого ранга (\(D_r >= D_R = d_r\))
- Мостик-Мера: чем выше принадлежность, тем первичней\(\frac{1+M_D}{1·M_D}\) — принадлежность в моменте, M количество своих членов в рамках D, 1 количество членов другого.Мера это уже почти новая сущность. Субъект уже ощущает себя общностью. Действует за неё и для неё. (см. Приложение)
Особенная общность — кластер
Граница и предел. K · D² · √N·N`/(N + N’)
Отношение общности к границе:
- Количественное отношение. Каждый из кластеров видит границу.(Чем мы разнообразней, тем больше выделяемся как целое)\(K\) — количество кластеров.
- Качественное отношение. Граница задаётся через “восприятие” субъекта.(Чем дальше, тем проще выделиться)\(D^2\) — диалектическое расстояние из предыдущей фазы.
- Мостик. Переводит из уровня отношения общностей/частей на уровень Всеобщего/целого.(Чем больше обе из сторон, тем проще выделиться)\(\sqrt{\frac{N·N'}{N + N'}}\) — прирост субъектов к Целому. Для общностей происходит соединение, но со стороны целого происходит прирост меньшего к большему.
Результат
На выходе получаем детерминированный результат:
- дерево-графвсе субъекты соединёны в единую сеть
- веса рёберравные квадраты диалектических расстояний
- размеченные данныхкаждый субъект принадлежит кластеру, или отмечен как выброс
- вложенные кластерапри желании их можно дробить
Заключение
Приложения:
Мера
Pseudocode
DRUHG
: Dialectical Ranking Universal Hierarchical Grouper.
INPUT datapoints and metric
No parameters
Build MST
: Array of point pairs and their weights.
(INIT)
FOR every point:
Find it's near neighbors and distances.
(Pure reciprocity)
FOR every point:
IF nearest neigbor has the point as it's nearest
Add the edge to the tree
Weight = distance squared
(Find minimal edge and connect to the tree)
REPEAT until all edges are connected in one tree:
INIT Optimal = INF
FOR every point:
FOR every point's neighbor:
IF point and neighbor are connected:
PASS
Evaluate R and r:
R - rank of the neighbor in point's POV
r - rank of the point in neighbor's POV
IF R > r:
PASS
Evaluate Equation r * D^2 * sqrt(1+M/M):
D - distance from the point to the neighbor of rank r
M - how many neighbors the point has in the subtree limited by D
IF Optimal < Equation:
Optimal = Equation
MEMORIZE Edge = (point, neighbor, D^2)
Add Edge to the tree
Label clusters
: Every datapoint has it’s cluster label.
INIT Limits(energies) of points to 0.
FOR every edge(pair, weight) from the MST(in order of appearing):
FOR Left and Right subtrees:
Evaluate Border equation K * D^2 * sqrt((N·N')/(N + N')):
K - number of clusters in that subtree
D^2 - weight of the edge
N and N' - amount of points in subtrees
IF Border >= limit of subtree:
That subtree is a cluster
It's limit = N * D^2
Merge subtrees
Add limits
Add number of clusters
Add number of points
Реализация на питоне
from druhg import DRUHG dr = DRUHG() dr.fit(your_dataset) dr.minimum_spanning_tree_.plot() dr.labels_ # -1 are outliers # enjoy
max_ranking
, который почти не влияет на точность, но повышает производительность.algorithm='slow'
врубит почти полный перебор, тру детерминизм(чуточку медленней)..labels_
с номерами кластеров..relabel()
.exclude
принимает список с номерами кластеров для разбивки на подкластеры.limit2
запрещает формирование кластеров большего размера.-1
.limit1
причисляет кластеры меньшего размера к выбросам.fix_outliers
причисляет выбросы к ближайшим кластерам.Общность
Филосовские размышления, которые были выкинуты из общего повествования. Содержат интересные замечания по поводу безразличного отношения к группе.