1. 程式人生 > >OpenCV機器學習筆記

OpenCV機器學習筆記

default 等等 ria enc 測試的 不清楚 term clust 間隔

KNN算法:

目的是分類,具體過程為,先訓練,這個訓練我估計只是對訓練數據進行一個存儲,knn測試的過程是根據測試樣例找出與這個樣例的距離最近的k個點,看這k個點中哪個分類所占的比例比較多,那麽這個樣例就屬於這個分類。所以我們要做的就是確定這個k,這個k是個超參數,所以需要手動測試。

具體使用方式為

1 knn = cv.KNearest()
2 
3 knn.train(train_datas,train_labels)
4 
5 ret,result,neighbours,dist = knn.find_nearest(test,k=5)

SVM算法:

支持向量機的目的是擬合出一條決策邊界,使得邊界兩端的數據可以被分開從而得到分類的目的,訓練的目的就是得到支持向量,支持向量是用來劃定邊界的,具體我也講不清楚,但大致是理解的。

使用方法大致如下

技術分享圖片
 1 svm_params = dict( kernel_type = cv2.SVM_LINEAR,
 2 
 3                     svm_type = cv2.SVM_C_SVC,
 4 
 5                     C=2.67, gamma=5.383 )
 6 
 7 svm = cv.SVM()
 8 
 9 svm.train(train_data,responses,svm_params)
10 
11 svm.save("svm_data.dat")
12 
13 result = svm.predict_all(test)
技術分享圖片

要提到的就是這裏kernel_type、svm_type、C、gamma

C: 目標函數的懲罰系數C,用來平衡分類間隔margin和錯分樣本的,default C = 1.0;

kernel:參數選擇有RBF, Linear, Poly, Sigmoid, 默認的是”RBF”;

gamma:核函數的系數(‘Poly’, ‘RBF’ and ‘Sigmoid’), 默認是gamma = 1 / n_features;

svm_type 這裏用的SVC就是分類

K-Means算法:

假設你要將數據分為2組,那麽算法會隨機選擇兩個中心C1和C2,計算每個點到兩個中心的距離,如果更接近C1,就標記為0,接近C2,就標記為1,如果更多分組就標記為2、3等等,然後計算所有被標記為0的向量的平均值,用這個平均值作為新的中心,同理標記為1的也是,如此往復,直到兩個中心點收斂到固定點,或者我們設定最大叠代次數或達到特定的精度停止,最終會讓這些數據點與其對應的之心之間的距離之和最小。

下面是具體使用方法

1 criteria = (cv.TERM_CRITERIA_EPS + cv.TERM_CRITERIA_MAX_ITER,10,1.0) 
2 flags = cv.KMEANS_RANDOM_CENTERS 
3 compactness,labels,centers = cv.kmeans(z,2,None,criteria,10,flags)

輸入的參數依此為

1. samples np.float32類型的訓練數據

2. nclusters(K) 需要分類的數目

3. critria 滿足終止的條件,滿足這個條件,就停止叠代

第一個參數

cv.TERM_CRITERIA_EPS - 達到精度epsilon就停止叠代

cv.TERM_CRITERIA_MAX_ITER - 達到最大叠代次數max_iter就停止叠代

cv.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER - 滿足上述任何條件停止叠代

第二個參數

max_iter - 最大叠代次數

第三個參數

epsilon - 要求的精度

4. attempts: 使用flag指定的算法初始執行算法的次數,估計是通過多次初始化得到一個準確值。

5. flags : 指定初始的中心點的方式,通常又兩種方式,cv.KMEANS_PP_CENTERS和cv.KMEANS_RANDOM_CENTERS

返回的參數為

1.compactness : 每個點到其相應中心的平方距離之和

2. labels : 標簽數組,其中每個元素標記為0、1、2等等

3. centers : 各組集群的中心

OpenCV機器學習筆記