https://scikit-learn.org/stable/modules/neighbors.htmlhtml
1. Cover和Hart在1968年提出了最初的臨近算法python
2. 分類算法(classification)算法
3. 輸入基於實例的學習(instance-based leaning)。懶惰學習(lazy learning)數據庫
開始時候不普遍創建模型,在歸類的時候才分類app
1. 步驟:dom
爲了判斷未知實例的類別,以全部已知類別的實例做爲參照ide
選擇參數K學習
計算未知實例與全部已知實例的距離測試
選擇最近K個已知實例 ---》 一般是奇數,更好的選擇idea
根據少數服從多數的投票法則, 讓未知實例歸類爲K個最鄰近樣本腫最多數的類別
2. 細節:
關於K
關於距離的衡量方法:
1). Euclidean Distance定義
3. 舉例:
1. 算法優勢:
簡單
易於理解
容易實現
經過對K的選擇可具有丟噪音數據的健壯性
2. 算法缺點
須要大量空間存儲全部已知實例
算法複雜度高(須要比較全部已知實例與要分類的實例)
好比Y那個點屬於不平衡,屬於短板
當其樣本分佈不平衡時, 好比其中一類樣本過大(實例數量過多)佔主導的時候, 新的未知實例容易被分類爲這個主導樣本, 由於這類樣本實例的數量過大,但這個新的
未知實例並無接近目標樣本
考慮距離, 根據距離增長權重
好比1/d(d:距離)
虹膜花數據集介紹
python3.6.3
# -*- coding:utf-8 -*- from sklearn import neighbors from sklearn import datasets knn = neighbors.KNeighborsClassifier() # 返回一個數據庫 iris ---> 默認的參數 # 'filename': 'C:\\python3.6.3\\lib\\site-packages\\sklearn\\datasets\\data\\iris.csv' iris = datasets.load_iris() print(iris) # 模型創建 # data爲特徵值 # target 爲向量,每一行對應的分類,一維的模型 knn.fit(iris.data, iris.target) # 預測 predictedLabel = knn.predict([[0.1, 0.2, 0.3, 0.4]]) print("===========================\n\n\n\n\n\n\n") # [0] 屬於第一類花的名字 # 'target_names': array(['setosa', 'versicolor', 'virginica'] print(predictedLabel)
模擬過程本身封裝--》不是我寫的,是我抄的--》代碼也沒測試
# -*- coding:utf-8 -*- import csv import random import math import operator def loadDataset(filename, split, trainingSet=[], testSet=[]): with open(filename, 'rb') 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: trainingSet.append(dataset[x]) else: testSet.append(dataset[x]) def euclideanDistance(instance1, instance2, length): distance = 0 for x in range(length): distance += pow((instance1[x] - instance2[x]), 2) return math.sqrt(distance) def getNeighbors(trainingSet, testInstance, k): distance = [] length = len(testInstance) -1 for x in range(len(trainingSet)): dist = euclideanDistance(testInstance, trainingSet[x], length) distance.append((trainingSet[x], dist)) distance.sort(key=operator.itemgetter(1)) neighbors = [] for x in range(k): neighbors.append(distance[x][0]) return neighbors def getResponse(neighbors): 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.iteritems(), key=operator.itemgetter(1), reverse=True) return sortedVotes[0][0] def getAccuracy(testSet, predictions): 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(): trainingSet = [] testSet = [] split = 0.57 loadDataset(r"...", split, trainingSet) print "Train set: " + repr(len(trainingSet)) print "Train set: " + repr(len(testSet)) predictions = [] k = 3 for x in range(len(testSet)): neighbors = getNeighbors(trainingSet, testSet[x], k) result = getResponse(neighbors) predictions.append(result) print("> predicted= " + repr(result) + ', actual=' + repr(testSet[x][-1])) accuracy = getAccuracy(testSet, predictions) print("Accuracy: " + repr(accuracy) + "%") main()