一、k-近鄰演算法(knn)概念
k nearest neighbor演算法又叫knn演算法,這個演算法是機器學習裡面乙個比較經典的演算法, 總體來說knn演算法是相對比較容易理解的演算法。
二、基本步驟:實現流程
計算已知類別資料集中的點與當前點之間的距離
按距離遞增次序排序
選取與當前點距離最小的k個點
統計前k個點所在的類別出現的頻率
返回前k個點出現頻率最高的類別作為當前點的**分類
基本實現**
from sklearn.neighbors import kneighborsclassifier
# 構造資料集
x = [[0], [1], [2], [3]]
y = [0, 0, 1, 1]
# 機器學習 -- 模型訓練
# 例項化api
estimator = kneighborsclassifier(n_neighbors=2)
# 使用fit方法進行訓練
estimator.fit(x, y)
# **其它值
rat = estimator.predict([[1]])
print(rat)
**結果如圖
三、距離度量
兩個n維變數a(x11,x12,…,x1n)與b(x21,x22,…,x2n)間的閔可夫斯基距離定義為:
其中p是乙個變引數:
當p=1時,就是曼哈頓距離;
當p=2時,就是歐氏距離;
當p→∞時,就是切比雪夫距離。
根據p的不同,閔氏距離可以表示某一類/種的距離。
夾角余弦取值範圍為[-1,1]。余弦越大表示兩個向量的夾角越小,余弦越小表示兩向量的夾角越大。當兩個向量的方向重合時余弦取最大值1,當兩個向量的方向完全相反余弦取最小值-1。
四、 k值的選擇
選擇較小的k值,就相當於用較小的領域中的訓練例項進行**,「學習」近似誤差會減小,只有與輸入例項較近或相似的訓練例項才會對**結果起作用,與此同時帶來的問題是「學習」的估計誤差會增大,換句話說,k值的減小就意味著整體模型變得複雜,容易發生過擬合;
選擇較大的k值,就相當於用較大領域中的訓練例項進行**,其優點是可以減少學習的估計誤差,但缺點是學習的近似誤差會增大。這時候,與輸入例項較遠(不相似的)訓練例項也會對**器作用,使**發生錯誤,且k值的增大就意味著整體的模型變得簡單。
k=n(n為訓練樣本個數),則完全不足取,因為此時無論輸入例項是什麼,都只是簡單的**它屬於在訓練例項中最多的類,模型過於簡單,忽略了訓練例項中大量有用資訊。
五、kd樹
實現k近鄰法時,主要考慮的問題是如何對訓練資料進行快速k近鄰搜尋。
這在特徵空間的維數大及訓練資料容量大時尤其必要。
k近鄰法最簡單的實現是線性掃瞄(窮舉搜尋),即要計算輸入例項與每乙個訓練例項的距離。計算並儲存好以後,再查詢k近鄰。當訓練集很大時,計算非常耗時。
為了提高knn搜尋的效率,可以考慮使用特殊的結構儲存訓練資料,以減小計算距離的次數。
黃色的點作為根節點,上面的點歸左子樹,下面的點歸右子樹,接下來再不斷地劃分,分割的那條線叫做分割超平面(splitting hyperplane),在一維中是乙個點,二維中是線,三維的是面。
黃色節點就是root節點,下一層是紅色,再下一層是綠色,再下一層是藍色。
模擬「二分查詢」:給出一組資料:[9 1 4 7 2 5 0 3 8],要查詢8。如果挨個查詢(線性掃瞄),那麼將會把資料集都遍歷一遍。而如果排一下序那資料集就變成了:[0 1 2 3 4 5 6 7 8 9],按前一種方式我們進行了很多沒有必要的查詢,現在如果我們以5為分界點,那麼資料集就被劃分為了左右兩個「簇」 [0 1 2 3 4]和[6 7 8 9]。
因此,根本就沒有必要進入第乙個簇,可以直接進入第二個簇進行查詢。把二分查詢中的資料點換成k維資料點,這樣的劃分就變成了用超平面對k維空間的劃分。空間劃分就是對資料點進行分類,「挨得近」的資料點就在乙個空間裡面。
構造根結點,使根結點對應於k維空間中包含所有例項點的超矩形區域;
通過遞迴的方法,不斷地對k維空間進行切分,生成子結點。在超矩形區域上選擇乙個座標軸和在此座標軸上的乙個切分點,確定乙個超平面,這個超平面通過選定的切分點並垂直於選定的座標軸,將當前超矩形區域切分為左右兩個子區域(子結點);這時,例項被分到兩個子區域。
上述過程直到子區域內沒有例項時終止(終止時的結點為葉結點)。在此過程中,將例項儲存在相應的結點上。
通常,迴圈的選擇座標軸對空間切分,選擇訓練例項點在座標軸上的中位數為切分點,這樣得到的kd樹是平衡的(平衡二叉樹:它是一棵空樹,或其左子樹和右子樹的深度之差的絕對值不超過1,且它的左子樹和右子樹都是平衡二叉樹)。
kd樹中每個節點是乙個向量,和二叉樹按照數的大小劃分不同的是,kd樹每層需要選定向量中的某一維,然後根據這一維按左小右大的方式劃分資料。在構建kd樹時,關鍵需要解決2個問題:
選擇向量的哪一維進行劃分;
如何劃分資料;
第乙個問題簡單的解決方法可以是隨機選擇某一維或按順序選擇,但是更好的方法應該是在資料比較分散的那一維進行劃分(分散的程度可以根據方差來衡量)。好的劃分方法可以使構建的樹比較平衡,可以每次選擇中位數來進行劃分,這樣問題2也得到了解決。
六、特徵工程-特徵預處理
特徵預處理定義:通過一些轉換函式將特徵資料轉換成更加適合演算法模型的特徵資料過程
為什麼我們要進行歸一化/標準化?
# 歸一化:受異常點影響大
# 例項化乙個轉換器 feature_range後面傳的是範圍
transfer = minmaxscaler(feature_range=(0, 1))
# 呼叫fit_transform方法
minmax_data = transfer.fit_transform(data[['milage', 'liters', 'consumtime']])
print("經過歸一化處理之後的資料為:\n", minmax_data)
# 標準化:基本不受異常點影響
# 均值為0,標準差為1
transfer = standardscaler()
# 呼叫fit_transform方法
minmax_data = transfer.fit_transform(data[['milage', 'liters', 'consumtime']])
print("經過標準化處理之後的資料為:\n", minmax_data)
k 近鄰演算法
此文章參考機器學習實戰一書,具體的理論知識可以參考該書。本文的初衷只是為了做乙個複習,將學過的知識加以整理,其中不免有一定的錯誤。2.k 近鄰演算法的原理介紹 k 近鄰演算法通過測量不同的特徵值之間的距離進行分類。它的工作原理如下 存在乙個樣本的資料集合,也成為訓練樣本集合。並且樣本集中的每個資料都...
K 近鄰演算法
k 近鄰演算法採用測量不同特徵值之間的距離方法進行分類。優點 精度高 對異常值不敏感 無資料輸入假定 缺點 計算複雜度高 空間複雜度高 適用資料範圍 數值型和標稱型 工作原理 存在乙個樣本資料集合,也稱作訓練樣本集,並且樣本集中每個資料都存在標籤,即我們知道樣本集中每一資料與所屬分類的對應關係。輸入...
K 近鄰演算法
首先,我們將 k 近鄰演算法的基本理論 其次我們將使用python從文字檔案中匯入並解析資料 再次,討論當存在許多資料 的時,如何避免計算距離時可能碰到的一些常見錯誤 最後,利用實際的例子講解如何使用k 近鄰演算法改進約會 1.1 knn演算法 工作原理 存在乙個樣本資料集合,也稱作訓練樣本集,並且...