- 操作系統:ubuntu22.04
- OpenCV版本:OpenCV4.9
- IDE:Visual Studio Code
- 編程語言:C++11
算法描述
cv::ml::KNearest 是 OpenCV 機器學習模塊中的一部分,它提供了實現 k-近鄰算法(k-Nearest Neighbors, KNN)的方法。KNN 是一種簡單但功能強大的分類和回歸算法,基于實例的學習方法,即根據最近鄰的類別來預測新樣本的類別。
主要特點
- 分類與回歸:既可以用于分類任務也可以用于回歸任務。
- 參數設置:可以指定鄰居的數量(k)、是否使用投票機制(對于分類)或平均值(對于回歸)等。
- 距離度量:支持不同的距離度量方式,默認為歐幾里得距離。
常用成員函數
以下是一些常用的 cv::ml::KNearest 類成員函數:
- 創建模型實例:
create():創建一個新的 KNearest 模型實例。 - 訓練模型:
- train(const Ptr& trainData, int flags=0):使用提供的訓練數據進行訓練。
- train(const Mat& samples, int layout, const Mat& responses):另一種形式的訓練函數,直接接受樣本和響應矩陣作為輸入。
- 預測:
- findNearest(InputArray samples, int k, OutputArray results, OutputArray neighborResponses=noArray(), OutputArray dist=noArray()) -
-const:找到最近的 k 個鄰居,并返回結果、鄰居的響應及距離(可選)。 - 保存與加載模型:
- save(const String& filename):將模型保存到文件。
- load(const String& filename):從文件加載模型。
使用步驟
- 準備數據:準備好你的訓練數據集,包括特征向量及其對應的標簽(對于分類任務)或目標值(對于回歸任務)。
- 初始化 KNearest 模型:使用 cv::ml::KNearest::create() 創建一個新的 KNearest 模型實例,并根據需要設置參數。
- 訓練模型:調用 train() 方法,傳入你的訓練數據來進行模型訓練。
- 評估模型:可以通過交叉驗證或者在獨立的測試集上評估模型性能。
- 預測新數據:使用訓練好的模型對新的未見過的數據進行預測,并獲取其所屬類別的概率分布或回歸值。
代碼示例
include <iostream>
#include <opencv2/ml.hpp>
#include <opencv2/opencv.hpp>using namespace cv;
using namespace cv::ml;
using namespace std;int main()
{// 準備訓練數據Mat samples = ( Mat_< float >( 4, 2 ) << 0.5, 1.0, 1.0, 1.5, 2.0, 0.5, 1.5, 0.0 );Mat responses = ( Mat_< int >( 4, 1 ) << 0, 0, 1, 1 );// 創建并配置 KNearest 模型Ptr< KNearest > knn_model = KNearest::create();knn_model->setDefaultK( 3 ); // 設置默認的鄰居數量為3knn_model->setIsClassifier( true ); // 設置為分類模式// 訓練模型bool ok = knn_model->train( samples, ROW_SAMPLE, responses );if ( ok ){// 保存模型knn_model->save( "knn_model.yml" );// 對新樣本進行預測Mat sample = ( Mat_< float >( 1, 2 ) << 1.6, 0.7 );Mat result, neighborResponses, dist;float response = knn_model->findNearest( sample, 3, result, neighborResponses, dist );cout << "The predicted response for the sample is: " << response << endl;cout << "Neighbor responses: " << neighborResponses << endl;cout << "Distances: " << dist << endl;}else{cerr << "Training failed!" << endl;}return 0;
}
運行結果
The predicted response for the sample is: 1
Neighbor responses: [1, 1, 0]
Distances: [0.19999997, 0.49999997, 1]