1. 程式人生 > >機器學習-分類器演算法-kNN

機器學習-分類器演算法-kNN

 首先,機器學習有眾多演算法,監督,無監督,聚類,迴歸......,初學者看到這麼多的演算法想必跟我一樣頭都暈了,到底在處理實際問題時候要怎麼從這麼多的演算法中選擇一個適合自己問題的方法,那麼我們就對它們簡單的歸一下類,根據我們實際中的使用目的,可以得出下面的導圖,舉例說明,如果我現在需要預測一個地區的房價,那麼按下圖的指示,我們應該選擇一個監督學習模型,那麼我們再來看下一步,我們的目標變數房價顯然是一個連續值,那麼我們就需要找一個迴歸演算法對我們的資料進行預測。

    但是我們需要清楚的是,根據下面的圖,我們只能在一定程度上縮小演算法的選擇範圍,一般並不存在最好的演算法或者可以給出最好結果的演算法,同時還要嘗試不同演算法的執行效果,一般來說,對於所選的每種演算法,都可以使用其他的機器學習技術改進其效能,發現好演算法的關鍵環節是反覆試錯的迭代過程,機器學習演算法雖然很多,但是使用演算法建立應用程式的步驟卻基本類似,這一部分將在後面進行詳細介紹。

一.分類器演算法

       機器學習的一個主要任務就是分類,它通過分析未分類資料,以確定如何將其放入已知群組,根據上面的導圖,分類方法屬於一種監督學習演算法,這類演算法必須要知道目標變數的類別資訊,對於分類和聚類,雖然只差一個字,但是其處理的問題是不同的,讓我們再來看上面的導圖,聚類演算法屬於無監督學習,此時的資料是沒有類別資訊的,也不會給定目標值,只是根據資料內部的特徵將特徵相似的資料劃分為同一類。而分類演算法通常會事先給定目標資料的類別資訊,將給定資料劃分為相應的類別。

       對於首先需要做的就是演算法訓練,也就是讓計算機學習如何分類,通常我們為演算法輸入大量已分類資料作為演算法的訓練集,通過一定的學習規則,學習出優秀的分類方式,為了測試學習演算法的效果,我們通常還會有測試資料集,輸入測試樣本時並不提供測試樣本的目標變數,由之前學習得到的分類演算法給出測試樣本屬於那個類別。

1.1 K-近鄰演算法(KNN)

    1.1.1 演算法概述

    簡單來說,k-近鄰演算法採用測量不同特徵值之間的距離的方法進行分類。它的工作原理是:存在一個樣本資料集合(訓練樣本),且樣本集每個資料都存在標籤,也就是說,僅僅看樣本資料集,我們可以清楚地知道每一個數據分別屬於哪一個類別,在輸入沒有標籤的新資料後,通過將新資料的每個特徵與樣本集資料對應的特徵進行比較,我們選擇樣本資料集中前k個最相似的資料(一般k<=20),最後選擇這k個最相似資料中出現次數最多的分類,作為新資料的分類。


根據上面圖我們可以看到使用KNN演算法時,通過比較未知分類的資料特徵與一隻樣本資料特徵之間的距離,找到前k個距離最近的樣本,例子中為E,D,B;再看這k個樣本資料分別屬於哪一類,在哪一類的資料越多,就說明這個未知分類的資料更有可能是該類別。

        因此,可以總結出k-近鄰方法實現的一般流程為:

(1)收集資料:爬蟲,RSS,標準資料集

(2)準備資料:距離計算所需要的數值

(3)分析資料

(4)測試演算法

(5)使用演算法:輸入樣本資料和結構化輸出結果,執行k-近鄰演算法判定輸入資料分別屬於哪個分類

1.1.2 實戰練習

首先,需要匯入兩個模組:numpy和operator模組

numpy模組:numpy是Python的一個科學計算的庫,提供了矩陣運算的功能,其一般與Scipy、matplotlib一起使用。其實,list已經提供了類似於矩陣的表示形式,不過numpy為我們提供了更多的函式。

operator模組:這個模組提供了一系列的函式操作,eg.operator.add(x,y)等於x+y

from numpy import *
import operator
def createDataSet():
	group=array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]])
	labels=['A','A','B','B']
	return group,labels
上面的createDataSet()函式,用於建立資料集合標籤,在終端進入python互動式開發環境,輸入:
>>>import kNN
上面的命令匯入了kNN模組,因此,就可以建立資料和標籤資訊
>>>group,labels=kNN.createDataSet()
>>>group
array([[1.,1.1],[1.,1.],[0.,0.],[0.,0.1]])
>>>labels
['A','A','B','B']
這裡有4組資料,每組資料有兩個我們已知的group屬性或特徵值,向量label包含了每個資料點的標籤資訊,這裡我們將[1,1.1]定義為A類,[0,0.1]定義為B類。

下面我們是用kNN演算法為每組資料分類,定義classify()函式是用kNN演算法將每組資料劃分到某個類中:

def classify(inX,dataset,labels,k):
	dataSetSize=dataset.shape[0];#得到dataset的第一圍大小
	diffMat=tile(inX,(dataSetSize,1))-dataSet#將inX擴充套件為與dataset行數相同的矩陣
	sqDiffMat=diffMat**2#(inX-dataset).^2
	sqDistances=sqDiffMat.sum(axis=1)#sqDistances每一行自身相加
	distances=sqDistances**0.5#對距離開根號
	sortedDistIndicies=distances.argsort()#返回距離陣列從小到大的索引值
	classCount={}
	for i in range(k):
		votelabel=labels[sortedDistIndicies[i]]#取距離最小的前k個索引
		classCount[votelabel]=classCount.get(votelabel,0)+1
	sortedClassCount=sorted(classCount.iteritems(),key=operate.itemgetter(1),reverse=True)
	return sortedClassCount[0][0]
	
測試:
>>>kNN.classify([1,1],group,labels,3)
得到結果‘A’





  參考文獻:《機器學習實戰》