機器學習之KNN演算法學習筆記

2022-08-23 17:15:14 字數 3953 閱讀 7683

1.1 cover和hart在2023年提出了最初的鄰近演算法

1.2 分類(classification)演算法|回歸演算法,這裡討論的是分類演算法

1.3 輸入基於例項的學習(instance-based learning), 懶惰學習(lazy learning)

為了判斷未知例項的類別,以所有已知類別的例項作為參照

選擇引數k

計算未知例項與所有已知例項的距離

選擇最近k個已知例項

根據少數服從多數的投票法則(majority-voting),讓未知例項歸類為k個最鄰近樣本中最多數的類別 

關於k關於距離的衡量方法:

2.2.1 euclidean distance 定義

未知電影屬於什麼型別?

利用python的機器學習庫sklearn: sklearnexample.py

import csv

import random

import math

import operator

def loaddataset(filename, split, trainingset = , testset = ):

'''匯入資料

:param filename:

:param split: 將資料總集以split為界限 分成訓練集和測試集

:param trainingset:

:param testset:

:return:

'''with open(filename, 'rt') as csvfile: # 以逗號為分隔符

lines = csv.reader(csvfile) # 讀取所有行

dataset = list(lines)

for x in range(len(dataset)-1):

for y in range(4):

dataset[x][y] = float(dataset[x][y])

if random.random() < split:

else:

def euclideandistance(instance1, instance2, length):

'''計算euclideandistance

:param instance1:

:param instance2:

:param length: 維度

:return:

'''distance = 0

for x in range(length):

distance += pow((instance1[x]-instance2[x]), 2)

return math.sqrt(distance)

def getneighbors(trainingset, testinstance, k):

'''返回最近的k個鄰居

:param trainingset: 訓練集

:param testinstance: 乙個測試例項

:param k: 引數k

:return:

'''distances =

length = len(testinstance)-1

for x in range(len(trainingset)):

#testinstance

dist = euclideandistance(testinstance, trainingset[x], length)

distances.sort(key=operator.itemgetter(1))

neighbors =

for x in range(k):

return neighbors

def getresponse(neighbors):

'''以距離排序,返回最近的幾個點

:param neighbors:

:return:

'''classvotes = {}

for x in range(len(neighbors)):

response = neighbors[x][-1]

if response in classvotes:

classvotes[response] += 1

else:

classvotes[response] = 1

sortedvotes = sorted(classvotes.items(), key=operator.itemgetter(1), reverse=true) # python3 裡的.items()返回的是列表,.iteritems()返回的是乙個迭代器

return sortedvotes[0][0]

def getaccuracy(testset, predictions):

'''**值和實際值的準確率

:param testset:

:param predictions:

:return:

'''correct = 0

for x in range(len(testset)):

if testset[x][-1] == predictions[x]:

correct += 1

return (correct/float(len(testset)))*100.0

def main():

#prepare data

trainingset =

testset =

split = 0.67

loaddataset(r'irisdata.txt', split, trainingset, testset)

print('train set: ' + repr(len(trainingset)))

print('test set: ' + repr(len(testset)))

#generate predictions

predictions =

k = 3

for x in range(len(testset)):

# trainingsettrainingset[x]

neighbors = getneighbors(trainingset, testset[x], k)

result = getresponse(neighbors)

print ('>predicted=' + repr(result) + ', actual=' + repr(testset[x][-1]))

accuracy = getaccuracy(testset, predictions)

print('accuracy: ' + repr(accuracy)+ '%')

if __name__ == '__main__':

main()

簡單易於理解

容易實現

通過對k的選擇可具備丟噪音資料的健壯性          

需要大量空間儲存所有已知例項

演算法複雜度高(需要比較所有已知例項與要分類的例項)

當其樣本分佈不平衡時,比如其中一類樣本過大(例項數量過多)佔主導的時候,新的未知例項容易被歸類為這個主導樣本,因為這類樣本例項的數量過大,但這個新的未知例項實際並木接近目標樣本

KNN演算法學習筆記

概念 k近鄰 knn,k nearestneighbor 所謂k最近鄰,就是k個最近的鄰居的意思,說的是每個樣本都可以用它最接近的k個鄰居來代表。核心思想 如果乙個樣本在特徵空間中的k個最相鄰的樣本中的大多數屬於某乙個類別,則該樣本也屬於這個類別,並具有這個類別上樣本的特性。最簡單的機器學習演算法之...

KNN演算法學習

knn演算法,我的理解是在有標籤的訓練樣本分佈中,有n個需要測試的樣本,通過尤拉距離 通過計算每個測試樣本得出離訓練最近的k個樣本,同過k個樣本中某一類標籤所佔的比例最高,則將該測試值 為該標籤。import numpy as np from math import sqrt from collec...

knn演算法學習

k近鄰近鄰演算法 多數表決規則等價於經驗風險最小化 損失函式最小化 一訓練資料為基礎,通過此類分類規則計算得到 一塊區域,有k個訓練資料,1,2,3個類別。1 2 3 當此區域判為1,損失函式等於2,3個數和 當此區域判為2,損失函式等於1,3個數和 當此區域判為3,損失函式為1,2個數和 選取損失...