Простым решением было бы найти ближайший центр тяжести кластера.
Ближайший центроид
x_new = [1 0 1];
% Find cluster centroid
X_c = zeros(numel(unique(c)), size(X,2));
for cid = unique(c)'
X_c(cid,:) = mean(X(c == cid,:));
end
% Find closest centroid
[~,c_new] = min(pdist2(x_new,X_c));
Если у вас есть больше образцов и вы хотите учитывать дисперсию, вы можете рассчитать z-оценку евклидовых расстояний.
Z-оценка расстояний
x_new = [1 0 1];
X_means = zeros(1,numel(unique(c)));
X_stds = zeros(1,numel(unique(c)));
X_c = zeros(numel(unique(c)), size(X,2));
for cid = unique(c)'
distances = pdist2(X(c == cid,:),mean(X(c == cid,:)));
X_means(cid) = mean(distances);
X_stds(cid) = std(distances);
X_c(cid,:) = mean(X(c == cid,:));
end
[~,c_new] = min((pdist2(x_new,X_c) - X_means)./X_stds);
Если вы хотите учитывать дисперсию компонентов, вы можете взять Z-оценку расстояний компонентов (я не уверен, что этот результат отличается от приведенного выше...)
Средний Z-показатель расстояний между компонентами
x_new = [1 0 1];
X_means = zeros(numel(unique(c)),size(X,2));
X_stds = zeros(numel(unique(c)),size(X,2));
X_c = zeros(numel(unique(c)), size(X,2));
for cid = unique(c)'
comp_distances = abs(X(c == cid,:) - repmat(mean(X(c == cid,:)),[numel(find(c==cid)),1]));
X_means(cid,:) = mean(comp_distances);
X_stds(cid,:) = std(comp_distances);
X_c(cid,:) = mean(X(c == cid,:));
end
[~,c_new] = min(mean(((repmat(x_new,[size(X_c,1),1])-X_c) - X_means)./X_stds,2));
person
Brendan Frick
schedule
12.01.2018