Python3.0 实现 机器学习 K-近邻算法
K-近邻算法具体思想
(1)计算已知类别数据集中的点于点当前之间的距离
(2)按照距离递增顺序排序
(3)选取与当前距离最小的K个点
(4)确定K个点所在类别出现的频率
(5)返回k个点中出现频率最高的类别作为当前点的预测分类
不多说 直接看代码:
from numpy import *
import operator
#生成数据集
def createDataSet():
data = array([[1.1,1.0],[1,1],[0,0],[0,0.2]])
lables = ['A','A','B','B']
return data,lables
# 定义分类器参数介绍:
# inX 分类的输入向量[0,1]
# lables 指的是数据所属于的分类,['A','A','B','B']
# k是选中k个点 3
# dataSet指的是数据矩阵array([1,1.1],[1.0,1.0],[0,0],[0,0.2]])
def classify0(inX, dataSet, labels, k):
dataSetSize = dataSet.shape[0]
# 求出坐标x,y差值
diffMat = tile(inX, (dataSetSize,1)) - dataSet
# 求出差值平方 difx**2 ,dify**y
sqDiffMat = diffMat**2
# 求出坐标差值的平方和
sqDistance = sqDiffMat.sum(axis=1)
# 平方和开根号就是与inX 真正相差的距离
distance = sqDistance**0.5
# 将distance排序,返回排序后的index这样可以定位到lable
sortedDistance = distance.argsort()
print(sortedDistance)
#选择距离最小的k个点
classCount = {}#dict 字典
for i in range(k):
#选出距离最小排序后的 所属类型
voteLable = labels[sortedDistance[i]]
# 相当于 map 如果能取出 +1 不能默认是0
classCount[voteLable] = classCount.get(voteLable,0) +1
print(classCount.items())
sortedClassCount =sorted(classCount.items(),key=operator.itemgetter(1),reverse=True)
return sortedClassCount[0][0]
data,lables = createDataSet()
my = classify0([1,1], data, lables,3)
print(my)