Здравствуйте, Aniskin, Вы писали:
A>Здравствуйте, Chorkov, Вы писали:
C>>В процедуре расчетов центров масс кластеров, рассчитывал центры масс только для основных цветов.
C>>Если точка принадлежит кластеру цвета AB, то учитывал ее (с весом 1/2) в кластерах A и B.
A>Спасибо за идею. Но не могу сообразить, как ее применить на практике. Предположим, в какой-то момент образовались следующие кластеры:
A>A — состоит из одного цвета со значением 4, центр кластера 4.
A>AB — состоит из трех цветов со значениями 6, 7 и 8, центр кластера (6 + 7 + 8) / 3 = 7.
A>B — состоит из двух цветов со значениями 11 и 13, центр кластера (11 + 13) / 2 = 12.
A>Как посчитать правильные центры кластеров A и B для указанных значений?
Можно ввести функцию ошибки и её минимизировать. Например так:
S(a,b)=(a-4)^2 + ((a+b)/2-6)^2 + ((a+b)/2-7)^2 + ((a+b)/2-8)^2 + (b-11)^2 + (b-13)^2
dS/da = 0
dS/db = 0
Получаешь простую линейную систему уравнений.
В твоём варианте примерно так A=3.3 B=11.6:
#!/usr/bin/lua
function AB(x)
local function sum(a) local s=0 for i=1,#a do s=s+a[i] end return s end
local n,s,a11,a22,a12,d,y
n={} s={} for i=1,3 do n[i]=#x[i] s[i]=sum(x[i]) end
a11=n[1]+n[2]/4
a22=n[3]+n[2]/4
a12=n[2]/4
d=a11*a22-a12*a12
y={ s[1]+s[2]/2, s[3]+s[2]/2 }
return (y[1]*a22-y[2]*a12)/d, (y[2]*a11-y[1]*a12)/d
end
print( AB{ {4}, {6,7,8}, {11,13} } )
3.2941176470588 11.647058823529