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