个人读书笔记,主要内容摘自《机器学习实战》—Peter Harrington
一、kNN算法简介
k-近邻算法通过获取输入数据与训练集中距离最近的前k个样本中出现频率最高的类别来达到分类的效果。
优点:精度高,对异常值不敏感,无数据输入假定
缺点:计算复杂度高,空间复杂度高
二、kNN算法
1.核心算法
from numpy import *
import operator # 引入运算符模块
def classify0(inX, dataSet, labels, k): # kNN算法
# 计算距离开始:
dataSetSize = dataSet.shape[0] # shape作用为获取数据维度,其中shape[0]为行数
diffMat = tile(inX, (dataSetSize, 1)) - dataSet # 计算输入向量inX到数据集各点各维度的数值差(x-x0)
sqDiffMat = diffMat ** 2 # (x-x0)^2
sqDistances = sqDiffMat.sum(axis=1) # axis=1矩阵按行压缩求和,=0按列压缩求和;目的Σ[(x-x0)^2]
distances = sqDistances ** 0.5 # 分行求欧式距离d=√Σ[(x-x0)^2]
# 计算距离结束
sortedDistIndicies = distances.argsort() # argsort返回的是数组值从小到大的索引值,即距离的排序
classCount = {}
for i in range(k):
voteIlabel = labels[sortedDistIndicies[i]] # 获取距离第i近的数据点对应的标签
classCount[voteIlabel] = classCount.get(voteIlabel, 0) + 1 # 获得距离最小的i个点{标签:出现次数}
sortedClassCount = sorted(classCount.items(), key=operator.itemgetter(1),
reverse=True) # sorted排序获取出现频率最高的值,key函数表示获取出现次数的值,reverse为True表示为降序
return sortedClassCount[0][0] # 返回前k个点出现频率最高的类别
2.解析数据
def file2matrix(filename): # 解析格式化文本文件
fr = open(filename)
arrayOLines = fr.readlines() # 读取文件所有行的内容
numberOfLines = len(arrayOLines) # 获取行数
returnMat = zeros((numberOfLines, 3)) # 初始化一个1000*3的零矩阵
classLabelVector = [] # 存储标签数组
index = 0
for line in arrayOLines:
line = line.strip() # 去掉每行前后空格和回车
listFromLine = line.split('\t') # 按制表符分开每行数据
returnMat[index, :] = listFromLine[0:3] # 将前三个数据按行存储在矩阵中
classLabelVector.append(int(listFromLine[-1])) # 将最后一个标签存在标签数组里
index += 1
return returnMat, classLabelVector # 返回矩阵和标签数组
3.可视化
略(还没看懂Matplotlib库)