機器學習分兩大類,有監督學習(supervised learning)和無監督學習(unsupervised learning)。有監督學習又可分兩類:分類(classification.)和回歸(regression),分類的任務就是把乙個樣本劃為某個已知類別,每個樣本的類別資訊在訓練時需要給定,比如人臉識別、行為識別、目標檢測等都屬於分類。回歸的任務則是**乙個數值,比如給定房屋市場的資料(面積,位置等樣本資訊)來**房價走勢。而無監督學習也可以成兩類:聚類(clustering)和密度估計(density estimation),聚類則是把一堆資料聚成弱乾組,沒有類別資訊;密度估計則是估計一堆資料的統計引數資訊來描述資料,比如深度學習的rbm。
根據機器學習實戰講解順序,先學習k近鄰法(k nearest neighbors-knn)
k近鄰法是有監督學習方法,原理很簡單,假設我們有一堆分好類的樣本資料,分好類表示每個樣本都乙個對應的已知類標籤,當來乙個測試樣本要我們判斷它的類別是,就分別計算到每個樣本的距離,然後選取離測試樣本最近的前k個樣本的標籤累計投票,得票數最多的那個標籤就為測試樣本的標籤。
例子(電影分類):
(圖一)
(圖一)中橫座標表示一部電影中的打鬥統計個數,縱座標表示接吻次數。我們要對(圖一)中的問號這部電影進行分類,其他幾部電影的統計資料和類別如(圖二)所示:
(圖二)
從(圖二)中可以看出有三部電影的類別是romance,有三部電影的類別是action,那如何判斷問號表示的這部電影的類別?根據knn原理,我們需要在(圖一)所示的座標系中計算問號到所有其他電影之間的距離。計算出的歐式距離如(圖三)所示:
(圖三)
由於我們的標籤只有兩類,那假設我們選k=6/2=3,由於前三個距離最近的電影都是romance,那麼問號表示的電影被判定為romance。
**實戰(python版本):
先來看看knn的實現:
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個距離最近的投票統計
classcount[voteilabel] = classcount.get(voteilabel,0) + 1 #前k個距離最近的投票統計
sortedclasscount = sorted(classcount.iteritems(), key=operator.itemgetter(1), reverse=true) #對投票統計進行排序
return sortedclasscount[0][0] #返回最高投票的類別
下面取一些樣本測試knn:
def file2matrix(filename):
fr = open(filename)
n程式設計客棧umberoflines = 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 = clawww.cppcns.comssify0(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 error rate is: %f" % (errorcount/float(numtestvecs))
print errorcount
上面的**中第乙個函式從文字檔案中讀取樣本資料,第二個函式把樣本歸一化,歸一化的好處就是降低樣本不同特徵之間數值量級對距離計算的顯著性影響
datingclasstest則是對knn測試,留了一半資料進行測www.cppcns.com試,文字檔案中的每條資料都有標籤,這樣可以計算錯誤率,執行的錯誤率為:the total error rate is: 0.064000
總結:優點:高精度,對離群點不敏感,對資料不需要假設模型
缺點:判定時計算量太大,需要大量的記憶體
工作方式:數值或者類別
下面挑選一步樣本資料發出來:
本文標題: python機器學習理論與實戰(一)k近鄰法
本文位址:
機器學習理論 GMM模型
李航.統計學習方法中高斯混合模型僅介紹一元高斯分布的情況,周志華.機器學習則採用多元高斯分布的寫法,但求解過程不夠突出em演算法的思想。此外,李航.統計學習方法中的一些寫法會產生誤解。因此下面過程主要根據李航.統計學習方法中的推導方法,但會有部分修正。gmm演算法主要利用em演算法來估計高斯混合模型...
機器學習 理論知識
一 混淆矩陣 confusion matrix 混淆矩陣也稱誤差矩陣,是表示精度評價的一種標準格式,用n行n列的矩陣形式來表示。具體評價指標有總體精度 製圖精度 使用者精度等,這些精度指標從不同的側面反映了影象分類的精度。在人工智慧中,混淆矩陣 confusion matrix 是視覺化工具,特別用...
初識機器學習 理論篇
1.什麼是機器學習?概念 利用計算機從歷史資料中找到規律,並把這些規律用到未來不確定場景的決策。場景 人來幹 資料分析 計算機來幹 機器學習 2.資料 歷史資料 3.規律 從資料中找出規律 概率論和數理統計 先抽樣 描述統計 假設檢驗 用模型刻畫 擬合 規律 維度較少時還能用,多維的不可用 4.機器...