kNN 算法
K-临近算法,最基本的机器学习算法之一,简单讲就是已有标本数据,计算预测的数据和每个标本数据的特征距离(如欧氏距离),
距离近的标本数据类型作为预测数据的类型。
原理:已有训练样本集,新的数据和训练样本特征比较,训练样本集中取特征最相似数据的标签。一般来说先找前K个最相似的
数据,这就是K-邻近算法的出处,然后K个最相似数据取出现次数最多数据的分类作为结果。
实现:
1、 找出与测试数据距离最近的k个数据,取其中出现次数最多的数据分类
2、 归一化数据:有时特征范围不一样导致影响计算,把所有特征转化到0-1之间,newValue=oldValue/(max-min)
距离计算距离公式:
两个向量(X1,Y1)和(X2,Y2)的距离
算法特点:
优点:精度高,对异常值不敏感,无数据输入假定
缺点:计算复杂度高、空间复杂度高
python 代码例子
def classify0(inX, dataSet, labels, k):
dataSetSize = dataSet.shape[0]
#先把inX构造成重复dataSetSize次的数组,(dataSetSize, 1)意思是变成二维数组,不是一维数组里重复。再减去dataSet
diffMat = tile(inX, (dataSetSize, 1)) - dataSet
sqDiffMat = diffMat ** 2
sqDinstance = sqDiffMat.sum(axis=1)
distances = sqDinstance ** 0.5
sortDistIndicies = distances.argsort()
classCount={}
for i in range(k):
voteIlabel = labels[sortDistIndicies[i]]
classCount[voteIlabel] = classCount.get(voteIlabel, 0) + 1
#print(classCount)
sortClassCount = sorted(classCount.iteritems(), key = operator.itemgetter(1), reverse = True)
#print(sortClassCount)
return sortClassCount[0][0]
测试代码,保存到classifyTest.py
#!/usr/bin/env python
#-*- coding:utf-8 -*-
from numpy import *
import operator
import kNN
def createDataSet():
group = array([[1.0, 1.1], [1.0, 1.0], [0, 0], [0, 0.1]])
labels = ['A', 'A', 'B', 'B']
return group, labels
group, labels = createDataSet()
#classRes = classify0([0,0], group, labels, 3)
#print(classRes)
def execute(inX):
group, labels = createDataSet()
return kNN.classify0(inX, group, labels, 3)
测试
>>> import classifyTest
>>> classifyTest.execute([0,0])
'B'