機器學習之kNN演算法

2021-09-07 03:04:45 字數 3691 閱讀 5659

knn原理及實踐

1 演算法介紹

總的來說,機器學習入門的第乙個演算法是k-近鄰演算法(knn),它的工作原理是:存在乙個樣本資料集合,也稱作訓練樣本集,並且樣本集中每個資料都存在標籤,即我們知道樣本集中每一資料與所屬分類的對應關係。輸入沒有標籤的新資料後,將新資料的每個特徵與樣本集中資料對應的特徵進行比較,然後演算法提取樣本集中特徵最相似資料(最近鄰)的分類標籤。一般來說,我們只選擇樣本資料集中前k個最相似的資料,這就是k-近鄰演算法中k的出處,通常k是不大於20的整數。最後,選擇k個最相似資料中出現次數最多的分類,作為新資料的分類。

很多初學者,對大資料的概念都是模糊不清的,大資料是什麼,能做什麼,學的時候,該按照什麼線路去學習,學完往哪方面發展,想深入了解,想學習的同學歡迎加入大資料學習qq群:957205962,有大量乾貨(零基礎以及高階的經典實戰)分享給大家,並且有清華大學畢業的資深大資料講師給大家免費授課,給大家分享目前國內最完整的大資料高階實戰實用學習流程體系

2 演算法流程

k-近鄰演算法的偽**如下:

對未知類別屬性的資料集中的每個點依次執行以下操作:

(1) 計算已知類別資料集中的點與當前點之間的距離;

(2) 按照距離遞增次序排序;

(3) 選取與當前點距離最小的k個點;

(4) 確定前k個點所在類別的出現頻率;

(5) 返回前k個點出現頻率最高的類別作為當前點的**分類。

3 案例實踐——使用 k-近鄰演算法改進約會**的配對效果

4 **

"""

created on dec 10, 2017

knn: k nearest neighbors

input:      inx: vector to compare to existing dataset (1xn)

dataset: size m data set of known vectors (nxm)

labels: data set labels (1xm vector)

k: number of neighbors to use for comparison

output:     the most popular class label

"""import numpy as np

def file2matrix(filename):

# 整理資料集

fr = open(filename)

arraylines = fr.readlines()    # 以列表的形式返回

numberlines = len(arraylines)

returnmat = np.zeros((numberlines, 3), dtype=float)

classtable =

classcol = np.zeros((numberlines, 1), dtype=int)

index = 0

for line in arraylines:

line = line.strip('\n')

everyline = line.split('\t')

returnmat[index, :] = everyline[0:3]

if classtable[index] == 'smalldoses':

classcol[index] = 2

elif classtable[index] == 'largedoses':

classcol[index] = 3

else:

classcol[index] = 1

index = index + 1

return returnmat, classcol

def norm(features):

# 歸一化特徵向量

normarray = np.zeros((features.shape[0], features.shape[1]))    

for i in range(features.shape[1]):

maxvals = np.max(features[:, i])

minvals = np.min(features[:, i])

dist = maxvals-minvals

normarray[:, i] = (features[:, i]-minvals)/dist    

return normarray

def classify(features, datatest, classlable, k):

# knn演算法實踐

normtrain = norm(features)

normtest = norm(datatest)

a = features.shape[0]

b = features.shape[1]

c = datatest.shape[0]

votelable =

group = {}

testlable = np.zeros((c, 1))

diffmat = np.zeros((a, b))

totaldist = np.zeros((a, 1))    

for i in range(c):        

for j in range(b):

diffmat[:, j] = (normtest[i, j] - normtrain[:, j])**2

totaldist[:, 0] = np.sqrt(np.sum(diffmat, axis=1))

sortdist = np.argsort(totaldist, axis=0)        

for n in range(k):

voteset = set(votelable)        

for item in voteset:

group[item] = votelable.count(item)

lastclass = max(zip(group.values(), group.keys()))

print(group)

testlable[i] = lastclass[1]

votelable =

group = {}    

return testlable

if __name__ == '__main__':

filepath = 'e:\機器學習\機器學習實戰資料\chapter2\machinelearninginaction\ch02\datingtestset.txt'

returnmat, classcol = file2matrix(filepath)

normarray = norm(returnmat)

features, datatest = normarray[0:900, :], normarray[900:1000, :]

testlable = classify(features, datatest, classcol[0:900], 10)    

# 計算正確率

e = 0

for y in range(100):        

if testlable[y] == classcol[900+y]:

e = e+1

print(e/100)

# 模型正確率為91%

機器學習之KNN演算法

在幾位志同道合的小夥伴的帶領下,開始了機器學習的路程,然而一切並不是想象的那麼簡單,因此本文記錄了自己的學習路程,希望還能堅持做好這件事。knn演算法是機器學習中屬於比較簡單的演算法,容易理解和閱讀。1.knn的應用 客戶流失 欺詐偵測等 更適合於稀有事件的分類問題 2.優缺點 優點 這是乙個簡單有...

機器學習演算法之KNN

物以類聚 人以群分,乙個例項與它周圍的例項屬於同一類的概率較大。給定乙個訓練資料集,對新輸入的例項,在訓練資料集中找到與該例項最鄰近的k個例項,這k個例項的多數屬於某個類,就把該輸入例項分為這個類。這裡,選用了歐氏距離,k的預設值為3,使用了sklearn提供的digits資料集來進行測試。inpu...

機器學習之KNN演算法

如果乙個樣本在特徵空間中的k個最相似 即特徵空間中最鄰近 的樣本中的大多數屬於某乙個類別,則該樣本也屬於這個類別。knn是一種非常古老而且簡單的分類方法 a a1,a2,a3 b b1,b2,b3 兩點的歐式距離是 因為計算的特徵值的平方,所以計算前需要先進行特徵處理 sklearn.neighbo...