Как я понимаю, при распознавании образов PCA используется для удаления ненужных данных в наборе данных, поэтому, когда набор данных будет использоваться в KMean, он будет выполнять меньше, чем набор данных, не являющийся PCA. Итак, я могу иметь код (псевдокод) что-то вроде этого:
assign .csv to var DATA
PCA_DATA = PCAcompute(DATA)
result = Kmean(PCA_DATA)
plotToGraph(result)
Я прав?
Я искал примеры программ, в которых он импортирует CSV, а затем выполняет кластеризацию с помощью PCA почти МЕСЯЦ. Мне нужно сравнить результат Kmean с результатом Kmean с PCA, используя набор данных iris.
Я изо всех сил пытаюсь понять ваши заявления.
Для начала PCA — это анализ главных компонентов. Это процесс, который принимает многомерные данные и пытается найти низкоразмерную (гипер) плоскость, в которой эти данные (почти) лежат. Таким образом, он удаляет ненужные размеры.
С KMean
ты наверное имеешь ввиду k-means clustering
, Это работает много быстрее в пространствах меньшего размера, поэтому PCA — это жизнеспособный способ уменьшить количество измерений.
(Запросы программы не по теме при переполнении стека)
Я не использовал 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. Я использовал эти сокращенные данные для обучения нейронной сети.