溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

python機器學(xué)習(xí)理論與實戰(zhàn)(一)K近鄰法

發(fā)布時間:2020-10-22 01:46:50 來源:腳本之家 閱讀:142 作者:marvin521 欄目:開發(fā)技術(shù)

機器學(xué)習(xí)分兩大類,有監(jiān)督學(xué)習(xí)(supervised learning)和無監(jiān)督學(xué)習(xí)(unsupervised learning)。有監(jiān)督學(xué)習(xí)又可分兩類:分類(classification.)和回歸(regression),分類的任務(wù)就是把一個樣本劃為某個已知類別,每個樣本的類別信息在訓(xùn)練時需要給定,比如人臉識別、行為識別、目標檢測等都屬于分類?;貧w的任務(wù)則是預(yù)測一個數(shù)值,比如給定房屋市場的數(shù)據(jù)(面積,位置等樣本信息)來預(yù)測房價走勢。而無監(jiān)督學(xué)習(xí)也可以成兩類:聚類(clustering)和密度估計(density estimation),聚類則是把一堆數(shù)據(jù)聚成弱干組,沒有類別信息;密度估計則是估計一堆數(shù)據(jù)的統(tǒng)計參數(shù)信息來描述數(shù)據(jù),比如深度學(xué)習(xí)的RBM。

根據(jù)機器學(xué)習(xí)實戰(zhàn)講解順序,先學(xué)習(xí)K近鄰法(K Nearest Neighbors-KNN)

K近鄰法是有監(jiān)督學(xué)習(xí)方法,原理很簡單,假設(shè)我們有一堆分好類的樣本數(shù)據(jù),分好類表示每個樣本都一個對應(yīng)的已知類標簽,當(dāng)來一個測試樣本要我們判斷它的類別是,就分別計算到每個樣本的距離,然后選取離測試樣本最近的前K個樣本的標簽累計投票,得票數(shù)最多的那個標簽就為測試樣本的標簽。

例子(電影分類):

python機器學(xué)習(xí)理論與實戰(zhàn)(一)K近鄰法

(圖一)

(圖一)中橫坐標表示一部電影中的打斗統(tǒng)計個數(shù),縱坐標表示接吻次數(shù)。我們要對(圖一)中的問號這部電影進行分類,其他幾部電影的統(tǒng)計數(shù)據(jù)和類別如(圖二)所示:

python機器學(xué)習(xí)理論與實戰(zhàn)(一)K近鄰法

(圖二)

從(圖二)中可以看出有三部電影的類別是Romance,有三部電影的類別是Action,那如何判斷問號表示的這部電影的類別?根據(jù)KNN原理,我們需要在(圖一)所示的坐標系中計算問號到所有其他電影之間的距離。計算出的歐式距離如(圖三)所示:

python機器學(xué)習(xí)理論與實戰(zhàn)(一)K近鄰法

(圖三)

     由于我們的標簽只有兩類,那假設(shè)我們選K=6/2=3,由于前三個距離最近的電影都是Romance,那么問號表示的電影被判定為Romance。

代碼實戰(zhàn)(Python版本):

先來看看KNN的實現(xiàn):

from numpy import * 
import operator 
from os import listdir 
 
 
def classify0(inX, dataSet, labels, k): 
  dataSetSize = dataSet.shape[0]  #獲取一條樣本大小 
  diffMat = tile(inX, (dataSetSize,1)) - dataSet #計算距離 
  sqDiffMat = diffMat**2  #計算距離 
  sqDistances = sqDiffMat.sum(axis=1)  #計算距離 
  distances = sqDistances**0.5  #計算距離 
  sortedDistIndicies = distances.argsort() #距離排序 
  classCount={}      
  for i in range(k): 
    voteIlabel = labels[sortedDistIndicies[i]]  #前K個距離最近的投票統(tǒng)計 
    classCount[voteIlabel] = classCount.get(voteIlabel,0) + 1 #前K個距離最近的投票統(tǒng)計 
  sortedClassCount = sorted(classCount.iteritems(), key=operator.itemgetter(1), reverse=True) #對投票統(tǒng)計進行排序 
  return sortedClassCount[0][0]  #返回最高投票的類別 

下面取一些樣本測試KNN:

def file2matrix(filename): 
  fr = open(filename) 
  numberOfLines = len(fr.readlines())     #get the number of lines in the file 
  returnMat = zeros((numberOfLines,3))    #prepare matrix to return 
  classLabelVector = []            #prepare labels return   
  fr = open(filename) 
  index = 0 
  for line in fr.readlines(): 
    line = line.strip() 
    listFromLine = line.split('\t') 
    returnMat[index,:] = listFromLine[0:3] 
    classLabelVector.append(int(listFromLine[-1])) 
    index += 1 
  return returnMat,classLabelVector 
   
def autoNorm(dataSet): 
  minVals = dataSet.min(0) 
  maxVals = dataSet.max(0) 
  ranges = maxVals - minVals 
  normDataSet = zeros(shape(dataSet)) 
  m = dataSet.shape[0] 
  normDataSet = dataSet - tile(minVals, (m,1)) 
  normDataSet = normDataSet/tile(ranges, (m,1))  #element wise divide 
  return normDataSet, ranges, minVals 
   
def datingClassTest(): 
  hoRatio = 0.50   #hold out 50% 
  datingDataMat,datingLabels = file2matrix('datingTestSet2.txt')    #load data setfrom file 
  normMat, ranges, minVals = autoNorm(datingDataMat) 
  m = normMat.shape[0] 
  numTestVecs = int(m*hoRatio) 
  errorCount = 0.0 
  for i in range(numTestVecs): 
    classifierResult = classify0(normMat[i,:],normMat[numTestVecs:m,:],datingLabels[numTestVecs:m],3) 
    print "the classifier came back with: %d, the real answer is: %d" % (classifierResult, datingLabels[i]) 
    if (classifierResult != datingLabels[i]): errorCount += 1.0 
  print "the total error rate is: %f" % (errorCount/float(numTestVecs)) 
  print errorCount 

上面的代碼中第一個函數(shù)從文本文件中讀取樣本數(shù)據(jù),第二個函數(shù)把樣本歸一化,歸一化的好處就是降低樣本不同特征之間數(shù)值量級對距離計算的顯著性影響

datingClassTest則是對KNN測試,留了一半數(shù)據(jù)進行測試,文本文件中的每條數(shù)據(jù)都有標簽,這樣可以計算錯誤率,運行的錯誤率為:the total error rate is: 0.064000

總結(jié):

優(yōu)點:高精度,對離群點不敏感,對數(shù)據(jù)不需要假設(shè)模型

缺點:判定時計算量太大,需要大量的內(nèi)存

工作方式:數(shù)值或者類別

下面挑選一步樣本數(shù)據(jù)發(fā)出來:

python機器學(xué)習(xí)理論與實戰(zhàn)(一)K近鄰法

參考文獻:machine learning in action

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持億速云。

向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI