關於knn的介紹可以參考:
這裡給出knn的c++實現,用於分類。訓練資料和測試資料均來自mnist,關於mnist的介紹可以參考: , 從mnist中提取的40幅影象,0,1,2,3四類各20張,每類的前10幅來自於訓練樣本,用於訓練,後10幅來自測試樣本,用於測試,如下圖:
實現**如下:
knn.hpp:
#ifndef fbc_nn_knn_hpp_
#define fbc_nn_knn_hpp_
#include #include namespace ann ;
} // namespace ann
#endif // fbc_nn_knn_hpp_
knn.cpp:
#include "knn.hpp"
#include #include #include #include "common.hpp"
namespace ann
templateint knn::set_train_samples(const std::vector>& samples, const std::vector& labels)
this->labels.get()[i] = labels[i]; }}
templateint knn::predict(const std::vector& sample, t& result) const
typedef std::pairvalue;
std::vectorinfo;
for (int i = 0; i < this->k + 1; ++i)
for (int i = 0; i < this->samples_number; ++i) ;
const t* p = this->samples.get() + i * this->feature_length;
for (int j = 0; j < this->feature_length; ++j)
info[this->k] = std::make_pair(s, this->labels.get()[i]);
std::stable_sort(info.begin(), info.end(), (const std::pair& p1, const std::pair& p2) );
} std::vectorvec(this->k);
for (int i = 0; i < this->k; ++i)
std::sort(vec.begin(), vec.end(), std::greater());
vec.erase(std::unique(vec.begin(), vec.end()), vec.end());
std::vector> ret;
for (int i = 0; i < vec.size(); ++i)
for (int i = 0; i < this->k; ++i)
} }int max = -1, index = -1;
for (int i = 0; i < ret.size(); ++i)
} result = ret[index].first;
return 0;
}template class knn;
template class knn;
} // namespace ann
測試**如下:
}執行結果如下:與opencv中knn結果相似。
K最近鄰演算法
參考 所謂k最近鄰,就是k個最近的鄰居的意思,說的是每個樣本都可以用它最接近的k個鄰居來代表。cover和hart在1968年提出了最初的鄰近演算法。knn是一種分類 classification 演算法,它輸入基於例項的學習 instance based learning 屬於懶惰學習 lazy ...
K最近鄰演算法
一 原理 k最近鄰演算法 k nearest neighbor,knn 是最基本的分類演算法,其基本原理是 從最近的k個鄰居 樣本 中,選擇出現次數最多的類別作為判定類別。k最近鄰演算法可以理解為是乙個分類演算法,常用於標籤的 如性別。實現knn演算法核心的一般思路 相似度計算 計算未知樣本和每個訓...
最近鄰與K近鄰演算法思想
在關於徑向基神經網路的一篇博文機器學習之徑向基神經網路 rbf nn 中已經對最近鄰思想進行過描述,但是寫到了rbf中有些重點不夠突出,所以,這裡重新對最近鄰和k近鄰的基本思想進行介紹,簡潔扼要的加以總結。最近鄰的基本思想 儲存所有觀察到的有標籤的樣本,然後對新來的測試樣本,在標籤樣本集中找到與測試...