第二章 K-近鄰算法

KNN近鄰算法

  • 優點:精度高,對異常值不敏感,無數據輸入假定
  • 缺點:計算複雜度高,空間複雜度高
  • 適用數據範圍:數值型和標稱型

步驟:
1)收集數據
2)準備數據
3)分析數據
4)訓練數據
5)測試算法
6)適用算法

對未知類別屬性的數據集中的每個點一次執行以下操作:
1)計算一直類別數據集中的點與當前點之間的距離
2)按照距離遞增次序排序
3)選取與當前點距離最小的k個點
4)確定前k個點所在類別出現的頻率
5)返回前k個點出現頻率最高的類別作爲當前點的預測分類

kNN.py文件代碼

#coding:utf-8
from numpy import *;#引入科學計算包
import operator    #引入科學計算包

#創建數據集
#dataSet:訓練樣本集
#labels:標籤向量
def createDataSet():
    group = array([[1.0,1.1],[1.0,1.0],[0.0,0.0],[0.0,0.1]])
    labels = ['A','A','B','B']
    return group, labels

Classify.py文件代碼

# -*- coding: utf-8 -*-
from numpy import * #引入科學計算包
import operator    #引入科學計算包

#分類算法核心
#inX:用於分類的輸入向量。即將對其進行分類。
#dataSet:訓練樣本集
#labels:標籤向量
#k:選取的離當前點距離最短的點個數k
def classify0(inX, dataSet,labels,k):
    dataSetSize = dataSet.shape[0]  #得到數組的行數。即知道有幾個訓練數據
    diffMat = tile(inX, (dataSetSize, 1)) - dataSet  # tile:numpy中的函數。tile將原來的一個數組,擴充成了4個一樣的數組。diffMat得到了目標與訓練數值之間的差值。
    sqDiffMat = diffMat ** 2  # 各個元素分別平方
    sqDistances = sqDiffMat.sum(axis=1)  # 一位數組相加,即得到了每一個距離的平方
    distances = sqDistances ** 0.5  # 開方,得到距離。
    sortedDistIndicies = distances.argsort()  # 升序排列返回對應的原始位置值
    # 選擇距離最小的k個點。
    classCount = {} #定義字典
    for i in range(k):
        voteIlabel = labels[sortedDistIndicies[i]]
        classCount[voteIlabel] = classCount.get(voteIlabel, 0) + 1  #dict.get(key,defautNoneReturnValue)
    # 排序
    sortedClassCount = sorted(classCount.iteritems(), key=operator.itemgetter(1), reverse=True)  #第一個屬性是字典迭代 key是定義比較的維度 比較第1維度的值大小 reverse是排序方式 false默認爲生序排序 True爲降序排序
    return sortedClassCount[0][0] #返回目標標籤中和目標向量最近的k個值對應的標籤出現頻率最大的值作爲預測值

測試調用class2Test.py文件

import kNN
import Classify
group,labels = kNN.createDataSet()
inX =[0.0,0.0]
result = Classify.classify0(inX,group,labels,2)
print result

案例:使用k-近鄰算法改進約會網站的配對效果

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章