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個數和 選取損失...