Какви данни от изображения се дават на клъстерирането на kmeans в matlab?

Имам 100 изображения в моята база данни. Използвам тези 100 изображения както като набор за обучение, така и като тестови изображения. Трябва да направя 5 клъстера. Използвам собствени лица (PCA) за извличане на функции. Какви данни трябва да бъдат дадени за командата kmeans в matlab ?

Синтаксис за командата kmeans:

[IDX,C] = kmeans(X,k)

1.Каква е стойността X?

2. Дали трябва да дадем евклидово разстояние като вход?

3. Дали трябва да дадем тегловен вектор на входните изображения?

Моля, обяснете ми подробно.

Опитах изходния код

X = []
    srcFiles = dir('C:\Users\rahul\Desktop\tomorow\*.jpg');  % the folder in which ur images exists
for i = 1 : length(srcFiles)
    filename = strcat('C:\Users\rahul\Desktop\tomorow\',srcFiles(b).name);
    Imgdata = imread(filename);
    X(:,  i) = princomp(Imgdata); 
end
[idx, c] = kmeans(X, 5)

Грешка, получавам:

Индексът надвишава размерите на матрицата. Грешка в pca (ред 4) filename =strcat('C:\Users\rahul\Desktop\tomorow\',srcFiles(b).name);


person prashanth    schedule 26.06.2014    source източник


Отговори (1)


Функцията PCA, която използвате (не знам какво точно е), създава вектор от n числа. Тези вектори описват картината и това трябва да се даде на алгоритъма за k-средни стойности.

Първо, изпълнете PCA за всичките 100 изображения, произвеждайки nX100 матрица.

X = []
for i = 1 : 100
    X(:,  i) = PCA(picture...) 
end

Ако pca върне ред вместо колона, имате нужда

X(:, i) = PCA(picture)'

Функциите k-means приемат този параметър, както и броя k на клъстерите. Така

[idx, c] = kmeans(X, 5);

Разстоянието, използвано за клъстериране, е евклидово по подразбиране. Ако искате различен показател за разстояние, можете да го предоставите като параметър. Вижте таблицата тук за наличните показатели за разстояние.

И накрая, стандартният алгоритъм за k-средни стойности не е претеглен, така че не можете да предоставите тегла на векторите.

person blue_note    schedule 26.06.2014
comment
Получавам тази грешка: X=[] Индексът надвишава размерите на матрицата. - person prashanth; 26.06.2014
comment
X = [] srcFiles = dir('C:\Users\rahul\Desktop\tomorow*.jpg'); за i = 1: дължина (srcFiles) filename = strcat('C:\Users\rahul\Desktop\tomorow\',srcFiles(b).name); Imgdata = imread(име на файл); X(:, i) = PCA(Imgdata); край [idx, c] = kmeans(X, 5) - person prashanth; 26.06.2014
comment
моля, проверете въпроса ми, добавих код, който опитах. Моля, помогнете ми. Получавам грешка. - person prashanth; 26.06.2014
comment
Моя грешка. X(:,i) = ... присвоява колона на колона от матрица, която вече има желания размер. Така че преди for цикъла трябва да е X = нули (100, N), където N е дължината на вектора, върнат от PCA. Относно грешката в името на файла, не мога да знам, това е нещо в локалния ви път. Проверете дали изображението наистина е заредено (imshow(imgData)), преди да го предадете на pca. Ако не, опитайте да поставите вашите изображения в същата папка като кода. Твърдо кодираните пътища са проблематични в повечето езици. - person blue_note; 27.06.2014
comment
Отново получих това съобщение за грешка: Опит за изпълнение на SCRIPT pca като функция - person prashanth; 04.07.2014
comment
актуализирах въпроса си с още един код. Моля, проверете го. въпрос - person prashanth; 04.07.2014
comment
pca(x) е името на функцията, заменете го с вашето правилно име на функция (изглежда, че е princomp във вашия код). относно грешката в пътя, която не мога да знам, отпечатайте имената на файловете, за да видите дали са правилни. също (като цяло) поставете файловете в папка във вашата папка източник, избягвайте пътеки с c:\... защото те се различават за различните системи и езици - person blue_note; 04.07.2014