入门分类回归算法——knn

2020-08-13 09:42发布

概述

基本分类与回归的方法

以既定的模型进行训练,多数表决来确定分类回归情况

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()