K 最近鄰法 KNN C 實現

2021-08-10 19:40:45 字數 4010 閱讀 6827

關於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近鄰的基本思想進行介紹,簡潔扼要的加以總結。最近鄰的基本思想 儲存所有觀察到的有標籤的樣本,然後對新來的測試樣本,在標籤樣本集中找到與測試...