Jump to content
Compvision.ru
Sign in to follow this  
mrgloom

kmeans и MNIST dataset

Recommended Posts

vector<Mat> db_lbp(db.size());

	for(int i=0;i<db.size();++i)

	{

		lbp::OLBP(db[i],db_lbp[i]);

	}

	vector<Mat> db_hist(db.size());

	for(int i=0;i<db.size();++i)

	{

		lbp::histogram(db_lbp[i],db_hist[i],256);

	}

	db= db_hist;

попробовал так, получилось нечто опять же не очень ,если судить по проекции на 2д.

еще встаёт вопрос, почему тогда нельзя было использовать гистограмму и без LBR.

Share this post


Link to post
Share on other sites

пишут что

mathematically a k-means method yields the same centroids as a PCA projection

http://ranger.uta.edu/~chqding/papers/KmeansPCA1.pdf

только всё равно не понятно как это использовать ибо из kмеаns мы получаем принадлежность к классу, а из PCA всего лишь базис.

Share this post


Link to post
Share on other sites

mrgloom, не знаю видели ли Вы эту страничку (по deep learning - помню Вы давали какую то ссылку), но думаю она будет для Вас интересна.

http://deeplearning.stanford.edu/wiki/index.php/UFLDL_Tutorial

ЗЫ: Внизу страницы есть матлабовские исходники некоторых модулей.

  • Like 1

Share this post


Link to post
Share on other sites

похоже про проекции называется задача Manifold learning

тут помоему лучше всего isomap отработало

http://scikit-learn.org/0.10/auto_examples/manifold/plot_lle_digits.html

t-sne кстати попробовал работает, но о качестве трудно судить, а матлабовская версия работает ощутимо долго.

http://homepage.tudelft.nl/19j49/t-SNE.html

и еще вот это в тему

Multidimensional scaling

http://en.wikipedia.org/wiki/Multidimensional_scaling

еще может пригодится

http://people.cs.uchicago.edu/~dinoj/ndaona/

сравнение алгоритмов

http://www.cs.wmich.edu/~yang/research/dembed/

еще 1 метод визуализации

http://people.cs.uchicago.edu/~dinoj/vis/digits/

визуализация на питоне

http://www.pymvpa.org/examples/mdp_mnist.html

  • Like 1

Share this post


Link to post
Share on other sites

isomap - красивее смотрится, те методы, которые дают нечто, похожее на треугольник, кластеры тоже не плохо собрали.

Share this post


Link to post
Share on other sites

решил попробовать svm на mnist

http://ttic.uchicago.edu/~smaji/projects/digits/

то что тут без напильника не завелось.

и в итоге классификаторы я качал отдельно новые версии libsvm и liblinear т.к. в матлабовском svm нет поддержки классификации для многих классов.

в итоге libsvm работает довольно долго и для большой выборки я так и не дождался окончания там пару раз было 10кк итераций каких то.

кстати я так и не понял что это за итерации.

liblinear работает быстро, но точность почему то хуже у неё, чем у линейного классификатора в libsvm.(опять же это похоже связано как то с итерациями ибо там 1к максимум их было).

попозже еще отпишу про точность и выложу архив со всем готовым.

sphog фичи кстати улучшают распознавание, только вектор увеличивается в 3 раза(по сравнению с просто пикселями).

непонятно почему, если я беру набор 70к запихиваю его в svm и потом прогоняю, точность всё равно не 100%, т.е. он не смог разделить тренировочную выборку или как это трактовать?

еще интересно будет попробовать сделать искажения цифр и дополнить этим тренировочную выборку, только я пока не нашел кода на матлабе для этого.

(но тут может быть опять же проблема, что если мы имеем сильную внутриклассовую различность, то результаты классификации могут ухудшиться(?) ну типа 1 класс имеет несколько подклассов, но мыслиться человеком как 1 класс).

  • Like 1

Share this post


Link to post
Share on other sites

попробовал libsvm с gpu

http://mklab.iti.gr/project/GPU-LIBSVM

я так понял там на gpu переложены какие то матричные операциии, которые делаются спомощью cublas, у меня заработало только собранное из сорцов, причем там нету интерфейса для матлаба, но можно из матлаба экспортировать данные с помощью svmwrite и потом использовать их просто с .exe.

но при работе я как то не заметил, что gpu хоть как то используется.

еще можно тот же mnist скачать отсюда

http://www.csie.ntu.edu.tw/~cjlin/libsvmtools/datasets/multiclass.html#mnist

вообщем в итоге похоже данные перед использованием надо скейлить на [0 1], ибо видимо какая то численная нестабильность.

причем обучение прошло относительно быстро ,а вот проверка долго, ибо наверно получилось большое кол-во support vectors.

запускал с параметрами

'-s 0 -t 0'

model =

Parameters: [5x1 double]

nr_class: 10

totalSV: 11625

rho: [45x1 double]

Label: [10x1 double]

sv_indices: [11625x1 double]

ProbA: []

ProbB: []

nSV: [10x1 double]

sv_coef: [11625x9 double]

SVs: [11625x784 double]

Accuracy = 96.9314% (67852/70000) (classification)

Share this post


Link to post
Share on other sites

попробовал варьировать С параметр и при С=10 выдало 100%, но непонятно хорошо ли это или плохо.(всмысле оверфитинг и все дела).

еще есть некий online svm

http://leon.bottou.org/papers/loosli-canu-bottou-2006

http://leon.bottou.org/projects/lasvm

с 8кк сэмплов сделаных путем деформации обычного mnist.

Share this post


Link to post
Share on other sites
попробовал варьировать С параметр и при С=10 выдало 100%, но непонятно хорошо ли это или плохо.(всмысле оверфитинг и все дела).

Это на тестовой выборке? Если да, то это вряд-ли оверфиттинг.

Share this post


Link to post
Share on other sites
Это на тестовой выборке? Если да, то это вряд-ли оверфиттинг.

это на той же выборке на которой проводилось обучение.

Share this post


Link to post
Share on other sites

Ну тогда это ни о чем, надо на тестовой проверить.

Share this post


Link to post
Share on other sites

ну так как раз меня бы не удивило, если бы было всё время 100%, а так в зависимости от параметра С может получиться и не 100%.

по дефолту например С=1 и не дает 100%.

Share this post


Link to post
Share on other sites

С - это параметр регуляризации (или для svm цена ошибки классификации), он задает гибкость модели.

Для SVM (обычно везде наоборот), чем больше C, тем меньше регуляризация, и больше гибкость модели.

Share this post


Link to post
Share on other sites

ну как я понял этот параметр как то тоже можно через grid search найти автоматом, что то там связанное с кроссвалидацией.

пока не пробовал.

попробовал применить svm для распознавания лиц, на orl database 40 индивидов и по 10 картинок на кадого и всего 400.

и вроде бы работает хорошо, только опять же эксперимент не совсем четный получился, ибо я брал так.

на матлабе

%orl dataset test

n=200;

k = randperm(size(orl_data,1));

ndata = orl_data(k(1:n),: ) ;

nlabel = orl_label(k(1:n),: ) ;

model= svmtrain(nlabel,ndata,'-s 0 -t 0')


n=400;

%вроде так не совсем честно ибо тестовая выборка должна не пересекаться

k = randperm(size(orl_data,1));

ndata = orl_data(k(1:n),: ) ;

nlabel = orl_label(k(1:n),: ) ;

[predict_label, accuracy, dec_values] = svmpredict(nlabel, ndata, model);
потом попробовал по честному на питоновых скриптах и батниках libsvm
libsvmwrite('orl_data.txt', orl_label, sparse(orl_data));
и разделил на тренировочную и тестовую
python subset.py orl_data.txt 100 orl_train.txt orl_test.txt
на 100 и 300. потом обучил и проверил
svm-train -t 0 orl_train.txt orl_model.txt svm-predict orl_test.txt orl_model.txt orl_res.txt
выдало 72% если наоборот 300 и 100 98% интересно, как это будет работать если классов будт много, можно еще проверить на feret db она вроде побольше. оказывается на матлабе разделить выборку тоже довольно просто
X = magic(8);

inds = randperm(64);

vector1 = X(1:5);

vector2 = X(6:12);

Share this post


Link to post
Share on other sites

еще по поводу визуализации, когда хотим максимизировать расстояние между классами и минимизировать внутри класса.

http://stats.stackexchange.com/questions/16305/dimensionality-reduction-technique-to-maximize-separation-of-known-clusters

  • Like 1

Share this post


Link to post
Share on other sites

на python используя sklearn

import numpy as np

import matplotlib.pyplot as plt

from itertools import product

from sklearn.decomposition import RandomizedPCA

from sklearn.datasets import fetch_mldata

from sklearn.utils import shuffle


#use all digits

mnist = fetch_mldata("MNIST original")

X_train, y_train = mnist.data[:70000] / 255., mnist.target[:70000]


#X_train, y_train = shuffle(X_train, y_train)

#X_train, y_train = X_train[:1000], y_train[:1000] # lets subsample a bit for a first impression


pca = RandomizedPCA(n_components=2)

fig, plot = plt.subplots()

fig.set_size_inches(50, 50)

plt.prism()


X_transformed = pca.fit_transform(X_train)

plot.scatter(X_transformed[:, 0], X_transformed[:, 1], c=y_train)

plot.set_xticks(())

plot.set_yticks(())


plt.tight_layout()

plt.savefig("mnist_pca.png")

(Я извиняюсь, но уж очень долго грузит, уменьшил размеры изображения в 2 раза (Smorodov) )

post-1-0-44679000-1379619955_thumb.png

Share this post


Link to post
Share on other sites

А сколько это считалось?

Share this post


Link to post
Share on other sites

2 mrgloom:

Рядом бы для сравнения поместить картинку из статьи Хинтона в Сайнс 2006г (с той, с которой начался мировой бум deep learning).

Чисто для спекуляции насчёт того, что алгоритм снижения размерности, явно не ставящий задачи минимизации внутриклассовых расстояний и максимизации межклассовых, - тоже отрабатывает на этой базе очень достойно.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

Sign in to follow this  

  • Recently Browsing   0 members

    No registered users viewing this page.

×