您的位置:首页 > 其它

K-近邻算法总结

2016-06-08 21:40 218 查看
k近邻学习是一种常见的监督学习方法,工作机制是给定测试样本,基于某种距离度量找出训练集中与其最近的k个训练样本,然后根据投票法确定测试样本的类别,k紧邻法是懒惰学习的著名代表。

当k=1时,假设给定样本是x,它的最近的邻居是z,则此时出错的概率为x与z标记不同的概率,不超过贝叶斯最优分类器的错误率的两倍

K近邻算法主要有以下特点

优点:精度高,对异常值不敏感,无输入数据嘉定,没有训练过程

缺点是每次都要计算所有样本和测试样例的距离,而且要对距离排序,计算复杂度高,空间复杂度高

下面是python实现的k近邻算法,假设从文件读入数据,输入数据由三维特征和标记构成

from numpy import *
import matplotlib
import matplotlib.pyplot as plt
import operator

#参考自《机器学习实战》

# 从文件处理输入
def fileToMatrix(filename):
fr = open(filename, 'r')
arrayOfLines = fr.readlines()
numberOfLines = len(arrayOfLines)
sampleMatrix = zeros((numberOfLines, 3))
labels = []
index = 0
for line in arrayOfLines:
line = line.strip()
listFromLine = line.split('\t')
for i in range(3):
sampleMatrix[index][i] = float(listFromLine[i])
labels.append(int(listFromLine[-1]))
index += 1
return sampleMatrix, labels

# 归一化特征值
# 在处理不同取值范围的特征值时,我们通常采用的方法是将数值归一化
# 如果不归一化的话,那么取值范围大的特征将对结果产生更大的影响
def autoNorm(dataset):
minVals = dataset.min(0)
maxVals = dataset.max(0)
ranges = maxVals - minVals
length = dataset.shape(0)
base = tile(minVals, (length, 1))
dataset = (dataet-base) / (tile(ranges, (length, 1)))
return dataset

# 分类
def classify(inX, dataset, labels, k):
datasetSize =  dataset.shape[0]
dataX = tile(inX, (datasetSize, 1))
dataDiffSquare = (dataset-dataX) ** 2
dataDist = (dataDiffSquare.sum(axis = 1)) ** 0.5
indiciesOrder = dataDist.argsort()
voteCount = {1 : 0, 2 : 0, 3 : 0}
for i in range(k):
voteCount[labels[indiciesOrder[i]]] += 1
ans = sorted(voteCount.items(), key=lambda d:d[1], reverse=True)
return ans[0][0]

dataset, labels = fileToMatrix('datingTestSet.txt')
inX = [40923,7.326976,0.953952]
ans = classify(inX, dataset, labels, 9)
#print(ans)
fig = matplotlib.pyplot.figure()
ax = fig.add_subplot(111)
ax.scatter(dataset[:, 1], dataset[:, 2])
matplotlib.pyplot.show()
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  机器学习 k近邻