博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
K-NN近邻算法详解
阅读量:4164 次
发布时间:2019-05-26

本文共 2577 字,大约阅读时间需要 8 分钟。

 K-近邻算法属于一种监督学习分类算法,该方法的思路是:如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别。

 (1) 需要进行分类,分类的依据是什么呢,每个物体都有它的特征点,这个就是分类的依据,特征点可以是很多,越多分类就越精确。

 (2) 机器学习就是从样本中学习分类的方式,那么就需要输入我们的样本,也就是已经分好类的样本,比如特征点是A , B2个特征,输入的样本甲乙丙丁,分别为[[1.0, 1.1], [1.0, 1.0], [5.0, 1.1], [5.0, 1.0]]。 那么就开始输入目标值,当然也要给特征了,最终的目标就是看特征接近A的多还是B的多,如果把这些当做坐标,几个特征点就是几纬坐标,那么就是坐标之间的距离。那么问题来了,要怎么看接近A的多还是B的多。

工作原理:存在一个样本数据集合,也称为训练样本集,并且样本集中每个数据都存在标签,即我们知道样本集中每一数据与所属分类的对应关系。输入没有标签的新数据后,将新数据的每个特征与样本集中数据对应的特征进行比较,然后算法提取样本集中特征最相似的数据,这就是k-近邻算法中k的出处,通常k是不大于20的整数。

#!/usr/bin/env python # -*- coding:utf-8 -*-# 科学计算包import numpy# 运算符模块import operator# 数据样本和分类模拟# 手动建立一个数据源矩阵group 和数据源的分类结果labelsdef createDataSet():    group = numpy.array([[1.0, 1.1], [1.0, 1.0], [5.0, 1.1], [5.0, 1.0]])    lables = ['A', 'A', 'B', 'B']    return group, lables# 进行KNN 算法# newInput为输入的目标,dataSet是样本的矩阵,labels是分类,k是需要取的个数def kNNClassify(newInput, dataSet, lables, k):    # 读取矩阵的行数,也就是样本数量    numSamples = dataSet.shape[0]    print("numSamples = ", numSamples)    # 变成和dataSet一样的行数,行数 = 原来 * numSamples,列数 = 原来 * 1,然后每个特征点和样本的点进行相减    # (numSamples, 1)表示矩阵newInput变为三维,重复次数一次    diff = numpy.tile(newInput, (numSamples, 1)) - dataSet    print("diff = ", diff)    # 平方    squaredDiff = diff ** 2    print("squaredDiff = ", squaredDiff)    # axis = 0 按列求和,axis = 1 按行求和    squaredDist = numpy.sum(squaredDiff, axis=1)    print("squaredDist = ", squaredDist)    # 开根号,计算距离    distance = squaredDist ** 0.5    print("distance = ", distance)    # 按大小逆序排序    sortedDistIndices = numpy.argsort(distance)    print("sortedDistIndices = ", sortedDistIndices)    classCount = {}    for i in range(k):        # 返回距离(key)对应类别(value)        voteLabel = labels[sortedDistIndices[i]]        print("voteLabel = ", voteLabel)        if voteLabel in classCount.keys():            value = classCount[voteLabel]            classCount[voteLabel] = value + 1        else:            classCount[voteLabel] = 1    print("classCount: ", classCount)    # 返回占有率最大的    sortedClassCount = sorted(classCount.items(), key=operator.itemgetter(1), reverse=True)    print("sortedClassCount = ", sortedClassCount)    return sortedClassCount[0][0]if __name__ == '__main__':    dataSet, labels = createDataSet()    testX = numpy.array([0, 0])    k = 3    outputLabel = kNNClassify(testX, dataSet, labels, k)    print("Your input is:", testX, "and classified to class: ", outputLabel)

总结:K-近邻算法是分类数据中最简单最有效的算法,是基于实例的学习,使用算法时我们必须要有接近实际数据的训练样本数据。K-近邻算法必须保存全部数据集,如果训练数据集很大,必须使用大量的存储空间。此外,由于必须对数据集中的每个数据计算距离值,实际使用时可能非常耗时;

          k-近邻算法的另一个缺陷是让无法给出任何数据的基础结构信息,因此我们也无法知晓平均实例样本和典型实例样本具有什么特征。         

 

转载地址:http://pcxxi.baihongyu.com/

你可能感兴趣的文章
HTTPS那些事 用java实现HTTPS工作原理
查看>>
oracle函数trunc的使用
查看>>
MySQL 存储过程或者函数中传参数实现where id in(1,2,3,...)IN条件拼接
查看>>
java反编译
查看>>
Class.forName( )你搞懂了吗?——转
查看>>
jarFile
查看>>
EJB与JAVA BEAN_J2EE的异步消息机制
查看>>
数学等于号是=那三个横杠是什么符
查看>>
HTTP协议详解
查看>>
java多线程中的join方法详解
查看>>
二叉树的最近公共祖先LCA
查看>>
数组中累加和为定值K的最长子数组长度
查看>>
素数对--腾讯2017校招编程
查看>>
JAVA集合--ArrayList实现原理
查看>>
idea添加gradle模块报错The project is already registered
查看>>
在C++中如何实现模板函数的外部调用
查看>>
HTML5学习之——HTML 5 拖放
查看>>
HTML5学习之——HTML 5 Canvas vs. SVG
查看>>
HTML5学习之——HTML 5 应用程序缓存
查看>>
HTML5学习之——HTML 5 Web Workers
查看>>