概述
基本分类与回归的方法
以既定的模型进行训练,多数表决来确定分类回归情况
1. k值的选择
2. 距离度量
3. 分类决策规则
分类实现
1. 给定训练用的数据集
多个维度,形成了矩阵
2. 给定用于分类的数据
数据维度与给定用来训练的数据集相匹配
展开,匹配维度
与每一条数据做匹配,相减取平方值,相加
对最后的和开根,得到与每一条数据的匹配度(距离)
选择距离最小的k个点
K个点中出现次数最多的类型项为结果的分类项
3. 返回类型
Demo
1. 导入包
from numpy import * import operator import os from collections import Counter
2. 数据集准备
给定一定条数的数据与对应的数据的类型
def createDataSet(): # group -- 训练数据集的 features # labels -- 训练数据集的 labels # ndarray类型 group = array([[1.0, 1.1], [1.0, 1.0], [0, 0], [0, 0.1]]) #list类型 labels = ['A', 'A', 'B', 'B'] return group, labels
3. 核心计算流程
(1)输入参数
1) 目标向量(要进行分类的数据)
2) 使用的数据集
3) 分类信息
4) 按照一定比例指定参考条数,计数为k
(2)计算流程
1) 对目标向量进行copy,维度与训练数据集匹配
2) 对应维度求差值,平方求和,开根号排序
选取k个做预测,k个中数量最多的对应类型为计算出的分类
def classify0(inX, dataSet, labels, k): # inX -- 用于分类的输入向量/测试数据 # dataSet -- 训练数据集的 features # labels -- 训练数据集的 labels # k -- 选择最近邻的数目 #距离计算,获取维度 dataSetSize = dataSet.shape[0] # 将测试用例复制,与给定的数据集具有相同维度 diffMat = tile(inX, (dataSetSize, 1)) - dataSet # 取平方 sqDiffMat = diffMat ** 2 # 将矩阵的每一行相加 sqDistances = sqDiffMat.sum(axis=1) # 开方 distances = sqDistances ** 0.5 # 从小到大排列 sortedDistIndicies = distances.argsort() # 2选择距离最小的k个点 classCount = {} for i in range(k): voteIlabel = labels[sortedDistIndicies[i]] classCount[voteIlabel] = classCount.get(voteIlabel, 0) + 1 # 排序并返回出现次数最多的那个类型 sortedClassCount = sorted(classCount.items(), key=operator.itemgetter(1), reverse=True) return sortedClassCount[0][0]
4. 输入输出
测试输出结果
# 测试 def test(): group, labels = createDataSet() print(str(group)) print(str(labels)) print(classify0([0.1, 0.1], group, labels, 3)) test()