python_機器學習_最臨近規則分類(K-Nearest Neighbor)KNN算法

1. 概念:

https://scikit-learn.org/stable/modules/neighbors.htmlhtml

  1. Cover和Hart在1968年提出了最初的臨近算法python

  2. 分類算法(classification)算法

  3. 輸入基於實例的學習(instance-based leaning)。懶惰學習(lazy learning)數據庫

  開始時候不普遍創建模型,在歸類的時候才分類app

2. 例子:

3. 算法詳述

 

 1. 步驟:dom

  爲了判斷未知實例的類別,以全部已知類別的實例做爲參照ide

  選擇參數K學習

  計算未知實例與全部已知實例的距離測試

  選擇最近K個已知實例  ---》 一般是奇數,更好的選擇idea

  根據少數服從多數的投票法則, 讓未知實例歸類爲K個最鄰近樣本腫最多數的類別

2. 細節:

  關於K

  關於距離的衡量方法:

    1). Euclidean Distance定義

      

 

3. 舉例:

 

 

4. 算法優缺點

 1.  算法優勢:

  簡單

  易於理解

  容易實現

  經過對K的選擇可具有丟噪音數據的健壯性

2. 算法缺點

  

須要大量空間存儲全部已知實例

算法複雜度高(須要比較全部已知實例與要分類的實例)

 

好比Y那個點屬於不平衡,屬於短板

當其樣本分佈不平衡時, 好比其中一類樣本過大(實例數量過多)佔主導的時候, 新的未知實例容易被分類爲這個主導樣本, 由於這類樣本實例的數量過大,但這個新的

未知實例並無接近目標樣本

5. 改進版本

 考慮距離, 根據距離增長權重

好比1/d(d:距離)

 

6. 應用

虹膜花數據集介紹

 

 

 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()
View Code
相關文章
相關標籤/搜索