1. 程式人生 > >圖片分類-K近鄰分類器

圖片分類-K近鄰分類器

你可以注意到當我們做預測的時候,如果僅僅用最近的圖片的是遠遠不夠的。其實,我們更常用的是k近鄰分類器。這個思想非常簡單。代替尋找訓練集中最近的圖片,我們會尋找k個最相近的圖片,並且讓他們再測試圖片上投票。特別的,再k=1的時候,我們已經涵蓋了最近鄰分類器。只管來說,更高的k值有一個平滑的影響使得分類器對極端值有更好的處理:

knn分類
這張圖表達了最近鄰分類,和5-最近鄰分類之間的差距,用二維的電荷3個類別(紅色、藍色、綠色區域)。標記顏色的區域可以展示出通過過L2距離計算出的決策範圍。白色部分展示的是有歧義的點(例如,類別投票至少要有兩種型別)。可以看到再一個最近鄰分類器中,異常資料點(例如,再藍色點中的綠色點)建立了一個很小的獨立不正確預測區域,然而5-近鄰分類器平滑的忽略了這些非法資料,而且提高了測試資料的一般性。我們也可以看到5-近鄰的灰色區域圖片也被近鄰選票所約束(例如,2個近鄰是紅色,另兩個是藍色,最後一個是綠色)。
實際中,你會經常想要使用k近鄰。但是k的值取多少。下面我們將解釋這個問題。

驗證集的超引數調優

k近鄰分類器需要一個k值的設定。但是那個數字是最好的呢?並且,我們看到還有很多不同的距離函式我們使用過:L1norm,L2norm,這裡還有許多其他的我們沒有考慮的函式(例如,向量點積)。這些都叫超引數並且他們經常出現在機器學習演算法的設計中。有時候選擇一個什麼樣的引數並不明顯。
你可能想我們應該嘗試不同的值看哪個表現的最好。這是一個很好的想法並且這也就是我們要做的。但是這必須很小心的取嘗試。特別的,我們不能用測試集來調整超引數。無論你何時設計機器學習演算法,你應該考慮測試集作為一個最先考慮的資源。因此,最真實的危險就是你可以調整你的超引數再測試集上執行的很好,但是如果你把你的模型運用到真實場景中去,效果就會大打折扣。實際中,我們都會說你過擬合

了你的測試集。另一個方面,當你使用他的時候,如果你把超引數測試運用在測試集上,那麼你會再測試集中有很好的效果,並且因此你的測試集準確率會提高。但實際上並沒有那麼高。但如果你僅僅在最後使用測試集,這裡還是存在著測試一個普遍性分類器的引數(在以後的課程中會有)。
僅僅再最後使用一次測試集評估
幸運的是,這裡有一個正確的方法去測試你的超引數並且不會接觸到測試集。這個想法就是把你的訓練集一分為二:一個很小的訓練集,我們叫做驗證集。使用CIFAR-10做個例子,我們可以使用49000作為訓練集,剩下的1000個作為驗證集。這個驗證集就是用來調超引數的。
這裡有一個很像CIFAR-10的例子:

# assume we have Xtr_rows, Ytr, Xte_rows, Yte as before
# recall Xtr_rows is 50,000 x 3072 matrix Xval_rows = Xtr_rows[:1000, :] # take first 1000 for validation Yval = Ytr[:1000] Xtr_rows = Xtr_rows[1000:, :] # keep last 49,000 for train Ytr = Ytr[1000:] # find hyperparameters that work best on the validation set validation_accuracies = [] for k in [1, 3, 5, 10, 20, 50, 100]: # use a particular value of k and evaluation on validation data nn = NearestNeighbor() nn.train(Xtr_rows, Ytr) # here we assume a modified NearestNeighbor class that can take a k as input Yval_predict = nn.predict(Xval_rows, k = k) acc = np.mean(Yval_predict == Yval) print 'accuracy: %f' % (acc,) # keep track of what works on the validation set validation_accuracies.append((k, acc))

在最後一個過程,我們可以畫一個圖來展示哪個k值可以得到最好的結果。我們會把這個值與真實測試集來評估準確率。
將你的測試集分為訓練集和驗證集。用驗證集來調所有的引數。在最後執行一次測試集並且報告準確率。

交叉驗證.

再這些例子中你的訓練集的大小會是很小的,人們有時會使用隨機調參技術叫做交叉驗證。再考慮上一個例子,這個思想就是不再玄奇前一千個點來做驗證集,二十你可以獲取一個更好的並且更少噪音的評估。例如,再5-個交叉驗證中,我們可以把訓練集分為5整份,用四個做訓練,1個做驗證。我們會迭代哪個是驗證集,評估效能,並且最終再不同的集合中平均效能。

針對k的驗證集
針對k值的5份交叉驗證。針對每個k值我們訓練四份並且再第五份上評估。對於每一個k我們接受一個再驗證集上的準確率(y軸就是準確率,每個結果就是一個點)。趨勢線由針對每個k的平均結果並且偏差顯示為標準差。在這個特殊的例子中,交叉驗證中表示當k=7的時候再這個特殊資料集中表現最好(對應圖中最高點)。如果我們把資料集切割成更多份,我們會看到更平滑的曲線。

實際中.

在實際中,人們更喜歡避免交叉驗證而是選擇用一個單獨驗證集,由於交叉驗證是非常耗時的。分割人們趨向於使用50%-90%的訓練集剩下的用驗證。然而,這取決於多種因素:例如如果超引數的數字非常大那麼你情願用更大的驗證集。如果很小,用交叉驗證是更安全的。實際中典型的份額就是3份、5份、和十份交叉驗證。
交叉驗證集
常規資料分塊。一個訓練和測試集給了。一個訓練集被分為幾份(例如五份)。1-4份訓練集。一份(例如圖中黃色部分)作為驗證集並且用來測試超引數。交叉驗證會迭代每一份作為驗證集,從1到5。這會叫做5份交叉驗證。在每個最後驗證過後並且所有最好的超引數決定以後,模型會在測試集中評估一次。

近鄰分類器的優點和缺點

來評價以下近鄰分類器的好壞是值得的。很明顯,一個優點就是很容易實現和理解。另外,分類器沒有時間訓練,由於所有訓練資料需要儲存和索引。然而,我們在測試時間上花費很多,由於區分一個測試用例需要與每一個訓練資料來對比。這點很不好,由於在實際中我們通常會更加關注測試時間而不是訓練時間。實際上,這節課後面的深度神經網路把這個權衡弄到了另外一個極限:他們訓練起來非常耗時,然而一旦訓練好了,就很容易去區分一個樣本。這種模式更適合於實際中。
另一方面,近鄰分類器的計算複雜度是一個很活躍的領域,並且有很多合適的近鄰演算法(ANN)和庫存在可以加速計算效率(例如,FLANN)。
最近鄰演算法有時可以在許多地方使用,但是很少在圖片識別中使用。一個問題就是圖片是高維的物件。並且高維空間的距離是非常不直觀的。以下圖片就是兩個圖片的L2相似度:

這裡寫圖片描述
高維資料的基於畫素距離非常直觀。一個原始圖片(左)和三個其他圖片都是在L2距離上都是很遠的。很明顯,畫素距離並不能很好的響應抽象的相似度。
這裡有一個更加視覺化的圖片讓你相信用畫素來對比圖片的不同是不夠的。我們可以用一個視覺化工具叫t-SNE來展示CIFAR-10的圖片並且把他們在二維中嵌入這樣他們之間的距離就被很好展示出來。圖片中,圖片旁邊的圖片被看作是L2距離很近的圖片。
這裡寫圖片描述

相關推薦

圖片分類-K近鄰分類

你可以注意到當我們做預測的時候,如果僅僅用最近的圖片的是遠遠不夠的。其實,我們更常用的是k近鄰分類器。這個思想非常簡單。代替尋找訓練集中最近的圖片,我們會尋找k個最相近的圖片,並且讓他們再測試圖片上投票。特別的,再k=1的時候,我們已經涵蓋了最近鄰分類器。只管來

機器學習之路: python k近鄰分類 鳶尾花分類預測

ber AD uda classes them cal col rds esc 使用python語言 學習k近鄰分類器的api 歡迎來到我的git查看源代碼: https://github.com/linyi0604/kaggle 1 from sklearn

python資料探勘入門與實踐--------電離層(Ionosphere), scikit-learn估計K近鄰分類,交叉檢驗,設定引數

ionosphere.data下載地址:http://archive.ics.uci.edu/ml/machine-learning-databases/ionosphere/ 原始碼及相關資料下載  https://github.com/xxg1413/MachineLea

利用無引數的K近鄰分類KNeighborsClassifier進行三類分類(複習4)

本文是個人學習筆記,內容主要涉及KNN(KNeighborsClassifier)對sklearn內建的Iris資料集進行三類分類。 K近鄰模型的大致決策方式如下圖: 尋找與某個待分類樣本在特徵空間中距離最近的K個已標記樣本作為參考,進而幫助做出分類決

K近鄰分類(KNN)手寫數字(MNIST)識別

KNN(K-Nearest-Neighbor) 是分類演算法中比較簡單的一個演算法。演算法思想非常簡單:對於一個未知類別的樣例,我們在很多已知類別的樣本中找出跟它最相近的K個樣本,賦予該樣例這K個樣本中佔多數的類別。 如圖中所示,如果我們選取

資料探勘-K-近鄰分類-Iris資料集分析-使用K-近鄰分類進行分類預測(四)

# coding: utf-8 #使用 scikit-learn庫的K-近鄰分類器完成分類 #1. 首先將資料集中的資料進行打亂 #2. 將資料分為訓練集和測試集兩部分 #3. 使用 k-means分類器進行分類訓練,得到預測模型 #4. 使用模型對測試集進行測試,並與真實

機器學習之分類——Matlab中各種分類的使用總結(隨機森林、支援向量機、K近鄰分類、樸素貝葉斯等)

      Matlab中常用的分類器有隨機森林分類器、支援向量機(SVM)、K近鄰分類器、樸素貝葉斯、整合學習方法和鑑別分析分類器等。各分類器的相關Matlab函式使用方法如下:首先對以下介紹中所用到的一些變數做統一的說明:    train_data——訓練樣本,矩陣的每

K近鄰分類

K近鄰分類 import numpy as np import matplotlib.pyplot as plt import pandas as pd import mglearn from sklearn.datasets import load_breast_cancer fr

K近鄰分類演算法

K最近鄰(k-Nearest Neighbor,KNN)分類演算法,是一個理論上比較成熟的方法,也是最簡單的機器學習演算法之一。該方法的思路是:如果一個樣本在特徵空間中的k個最相似(即特徵空間中最鄰近)的樣本中的大多數屬於某一個類別,則該樣本也屬於這個類別。 下

K近鄰分類演算法實現 in Python

K近鄰(KNN):分類演算法* KNN是non-parametric分類器(不做分佈形式的假設,直接從資料估計概率密度),是memory-based learning.* KNN不適用於高維資料(curse of dimension)* Machine Learning的Py

K近鄰分類演算法 (K-Nearest Neighbor)

K近鄰分類演算法 (K-Nearest Neighbor) 宣告:版權所有,轉載請聯絡作者並註明出處: http://blog.csdn.net/u013719780?viewmode=contents 知乎專欄: https://www.zhihu.com/people

k近鄰分類演算法的python實踐

最近學習機器學習演算法,用python實現。 這裡記錄k近鄰演算法的python原始碼實現和一些理解。 文章參考了zouxy09的博文,程式碼參考machine learning in action. k近鄰分類演算法原理: 1、根據k近鄰,計算K個離待分類物品最近的物品

k近鄰分類演算法(kNN)

註明:部分內容來自維基百科 In both cases, the input consists of the k closest training examples in thefeature space. The output depends on whether k

【模式識別】K-近鄰分類演算法KNN

K-近鄰(K-Nearest Neighbors, KNN)是一種很好理解的分類演算法,簡單說來就是從訓練樣本中找出K個與其最相近的樣本,然後看這K個樣本中哪個類別的樣本多,則待判定的值(或說抽樣)就屬於這個類別。KNN演算法的步驟計算已知類別資料集中每個點與當前點的距離;選

《機器學習系統設計》之k-近鄰分類演算法

前言:     本系列是在作者學習《機器學習系統設計》([美] WilliRichert)過程中的思考與實踐,全書通過Python從資料處理,到特徵工程,再到模型選擇,把機器學習解決問題的過程一一呈現。書中設計的原始碼和資料集已上傳到我的資源:http://downloa

k近鄰分類(KNN)

    近來學習了最近鄰分類KNN(k Nearest Neighbors),寫下心得,以為記錄。    K近鄰的原理很簡單,對於資料集,可以分為訓練集和測試集,KNN使用訓練集全部資料作為分類計算的依據。輸入一個待分類樣本,計算該樣本與訓練集所有樣本的距離,挑選出距離最小的

Python實現K近鄰演算法_分類

收集資料 31,65,4,1 33,58,10,1 33,60,0,1 34,59,0,2 34,66,9,2 這是關於乳腺癌已手術患者存活時間(壽命)的樣本集,文字檔案中共包含306個樣本,樣本包含的屬性有: 1. 患者做手術時的年齡 opAge

基於TensorFlow的K近鄰(KNN)分類實現——以MNIST為例

KNN分類原理 TF的KNN程式碼 def load_mnist_data(filename,isbatch=0,train_nums=1000,test_nums=200): from tensorflow.examples.

【計算機視覺之三】運用k近鄰演算法進行圖片分類

這篇文章主要給不知道計算機視覺是啥的人介紹一下影象分類問題以及最近的最近鄰演算法。 目錄 影象分類 1.1 影象分類的原理 1.2 面臨的問題 1.3 影象分類任務 最近鄰演算法 程式碼實現 L2距離 用k-近鄰進行圖片分類 5.1 k近鄰分類原理

K近鄰算法——多分類問題

避免 曼哈頓 相互 個數 一個 實例 給定 通過 enter   給定一個訓練數據集,對新的輸入實例,在訓練數據集中找到與該實例最鄰近的K個實例,這K個實例的多數屬於某個類,就把該類輸入實例分為這個類。 KNN是通過測量不同特征值之間的距離進行分類。它的的思路是:如果一個