Java — соединение KMean и PCA

Как я понимаю, при распознавании образов PCA используется для удаления ненужных данных в наборе данных, поэтому, когда набор данных будет использоваться в KMean, он будет выполнять меньше, чем набор данных, не являющийся PCA. Итак, я могу иметь код (псевдокод) что-то вроде этого:

 assign .csv to var DATA
PCA_DATA = PCAcompute(DATA)
result = Kmean(PCA_DATA)
plotToGraph(result)

Я прав?

Я искал примеры программ, в которых он импортирует CSV, а затем выполняет кластеризацию с помощью PCA почти МЕСЯЦ. Мне нужно сравнить результат Kmean с результатом Kmean с PCA, используя набор данных iris.

0

Решение

Я изо всех сил пытаюсь понять ваши заявления.

Для начала PCA — это анализ главных компонентов. Это процесс, который принимает многомерные данные и пытается найти низкоразмерную (гипер) плоскость, в которой эти данные (почти) лежат. Таким образом, он удаляет ненужные размеры.

С KMean ты наверное имеешь ввиду k-means clustering, Это работает много быстрее в пространствах меньшего размера, поэтому PCA — это жизнеспособный способ уменьшить количество измерений.

(Запросы программы не по теме при переполнении стека)

0

Другие решения

Я не использовал KMean, но я использовал PCA для своих данных обучения нейронной сети, чтобы уменьшить возможности. Это в C ++ интерфейс OpenCV. Давайте начнем с чтения файла CSV. Мой CSV-файл похож на:

im_path_1;label1
im_path_2;label2

Итак, чтобы прочитать этот CSV-файл, моя функция:

void read_csv (константная строка имя файла, вектор изображения, вектор метки, разделитель символов = ';')
{
файл std :: ifstream (filename.c_str (), ifstream :: in);
если (! файл)
{
string error_message = "Не указан правильный входной файл, проверьте указанное имя файла.";
CV_Error (1, error_message);
}
строка строки, путь, классная метка;
while (getline (файл, строка))
{
струнная лень (линия);

getline (лень, путь, разделитель);
getline (liness, classlabel);

если (! path.empty ()  ! Classlabel.empty ())
{
Mat im = imread (путь, 0);

images.push_back (им);
labels.push_back (atoi (classlabel.c_str ()));
}
}
}

Содержит данные в векторе переменных Mat. PCA OpenCV требует, чтобы данные катились как векторы строк в переменной Mat. Для этого:

Mat rollVectortoMat(const vector<Mat> &data)
{
Mat dst(static_cast<int>(data.size()), data[0].rows*data[0].cols, CV_32FC1);
for(unsigned int i = 0; i < data.size(); i++)
{
Mat image_row = data[i].clone().reshape(1,1);
Mat row_i = dst.row(i);
image_row.convertTo(row_i,CV_32FC1, 1/255.);
}
return dst;
}

Простое использование этой функции:

int main()
{

PCA pca;

vector<Mat> images_train;
vector<int> labels_train;

read_csv("train1k.txt",images_train,labels_train);

Mat rawTrainData = rollVectortoMat(images_train);

int pca_size = 500;

Mat trainData(rawTrainData.rows, pca_size,rawTrainData.type());
Mat testData(rawTestData.rows,pca_size,rawTestData.type());pca(rawTrainData,Mat(),CV_PCA_DATA_AS_ROW,pca_size);

for(int i = 0; i < rawTrainData.rows ; i++)
pca.project(rawTrainData.row(i),trainData.row(i));

cout<<trainData.size()<<endl;

return 0;
}

trainData переменная — сокращенная версия набора поездов. И для pca_size переменная; вместо того, чтобы использовать его как 500; Вы можете дать PCA 0.95 сохранить %95 дисперсия. Я надеюсь, что это поможет со стороны PCA. Я использовал эти сокращенные данные для обучения нейронной сети.

0

По вопросам рекламы [email protected]