请选择 进入手机版 | 继续访问电脑版
搜索
房产
装修
汽车
婚嫁
健康
理财
旅游
美食
跳蚤
二手房
租房
招聘
二手车
教育
茶座
我要买房
买东西
装修家居
交友
职场
生活
网购
亲子
情感
龙城车友
找美食
谈婚论嫁
美女
兴趣
八卦
宠物
手机

教你学Python26-knn临近算法

[复制链接]
查看: 112|回复: 0

1万

主题

1万

帖子

3万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
39490
发表于 2020-1-19 15:05 | 显示全部楼层 |阅读模式


KNN 概述

k-近邻(kNN, k-NearestNeighbor)算法是一种基天职类与回归方式,我们这里只会商分类题目中的 k-近邻算法。
一句话总结:近朱者赤近墨者黑! 工作道理: 存在一个样本数据聚集,也称作为练习样本集,而且样本会合每个数据都存在标签,即我们晓得样本会合每一个数据与所属分类的对应关系。输入没有标签的新数据后,将新的数据的每个特征与样本会合数据对应的特征举行比力,然后算法提取样本最类似数据(近来邻)的分类标签。一样平常来说,我们只挑选样本数据会合前k个最类似的数据,这就是k-近邻算法中k的出处,凡是k是不大于20的整数。末端,挑选k个最类似数据中出现次数最多的分类,作为新数据的分类。
k近邻算法的输入为实例的特征向量,对应于特征空间的点;输出为实例的种别,可以取多类。k 近邻算法假定给定一个练习数据集,其中的实例种别已定。分类时,对新的实例,按照其 k 个近来邻的练习实例的种别,经过大都表决等方式举行猜测。是以,k近邻算法不具有显式的进修进程。 k近邻算法现实上利用练习数据集对特征向量空间举行别离,并作为其分类的“模子”。 k值的挑选、间隔怀抱以及分类决议法则是k近邻算法的三个底子要素。
KNN 场景

电影可以依照题材分类,那末怎样区分 行动片 和 恋爱片 呢?

  • 行动片:打架次数更多
  • 恋爱片:亲吻次数更多
基于电影中的亲吻、打架出现的次数,利用 k-近邻算法机关步伐,便可以自动别离电影的题材典范。


教你学Python26-knn临近算法  区块链


教你学Python26-knn临近算法  区块链



现在按照上面我们获得的样本会合全数电影与未知电影的间隔,依照间隔递增排序,可以找到 k 个间隔近来的电影。假定 k=3,则三个最靠近的电影依次是, He's Not Really into Dudes 、 Beautiful Woman 和 California Man。knn 算法依照间隔近来的三部电影的典范,决议未知电影的典范,而这三部电影尽是恋爱片,是以我们判定未知电影是恋爱片。对于K近邻算法概念还没搞太清楚的同学 可以往下面看 直到看完全部demo你便可以大白KNN算法是干啥的了
教你学Python26-knn临近算法  区块链


KNN 道理

KNN 工作道理

  • 假定有一个带有标签的样本数据集(练习样本集),其中包含每条数据与所属分类的对应关系。
  • 输入没有标签的新数据后,将新数据的每个特征与样本会合数据对应的特征举行比力。盘算新数据与样本数据会合每条数据的间隔。对求得的全数间隔举行排序(从小到大,越小表现越类似)。取前 k (k 一样平常小于即是 20 )个样本数据对应的分类标签。
  • 求 k 个数据中出现次数最多的分类标签作为新数据的分类。
KNN 普通大白
给定一个练习数据集,对新的输入实例,在练习数据会合找到与该实例最附近的 k 个实例,这 k 个实例的大都属于某个类,就把该输入实例分为这个类。
KNN 斥地流程
收集数据:任何方式预备数据:间隔盘算所需要的数值,最好是结构化的数据格式分析数据:任何方式逊с法:此步伐不适用于 k-近邻算法测试算法:盘算毛病率利用算法:输入样本数据和结构化的输出成果,然后运转 k-近邻算法判定输入数据分类属于哪个分类,末端对盘算出的分类实行后续处置赏罚
教你学Python26-knn临近算法  区块链


KNN 算法特点
优点:精度高、对很是值不敏感、无数据输入假定弱点:盘算复杂度高、空间复杂度高适用数据范围:数值型和标称型
教你学Python26-knn临近算法  区块链




#!/usr/bin/env python# -*- encoding: utf-8 -*-'''@File    :   KNN.py@Time    :   2019/03/27 11:07:01@Author  :   xiao ming @Version :   1.0@Contact :   xiaoming3526@gmail.com@Desc    :   KNN近邻算法@github  :   https://github.com/aimi-cn/AILearners@reference:  https://github.com/apachecn/AiLearning'''# here put the import libfrom __future__ import print_functionfrom numpy import *import numpy as npimport operator# 导入科学盘算包numpy和运算符模块operatorfrom os import listdirfrom collections import Counterdef createDataSet():    """    建立数据集和标签    挪用方式    import kNN    group, labels = kNN.createDataSet()    """    group =  array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]])    labels = ['A','A','B','B']    return group, labelsdef test1():    group, labels = createDataSet()    '''    [[1.  1.1]  #标签对应A    [1.  1. ]   #标签对应A    [0.  0. ]   #标签对应B    [0.  0.1]]  #标签对应B    ['A', 'A', 'B', 'B']    '''    #print(str(group))    #print(str(labels))    #print(classify0([0.1, 0.1], group, labels, 3))    print(classify1([0.1, 0.1], group, labels, 3))def classify0(inX, dataSet, labels, K):    '''    inX: 用于分类的输入向量 输入的测试数据    dataSet:输入的练习样本    lables:标签向量    k:挑选近来邻人的数目 凡是小于20    留意:labels元素数目和dataSet行数类似;步伐利用欧式间隔公式.    猜测数据地点分类可在输入以下命令    kNN.classify0([0,0], group, labels, 3)    '''    # -----------实现 classify0() 方式的第一种方式----------------------------------------------------------------------------------------------------------------------------    # 1. 间隔盘算    #盘算数据巨细    dataSetSize = dataSet.shape[0]    '''    tile利用: 列3表现复制的行数, 行1/2表现对inX的反复的次数    In [2]: inx = [1,2,3]    In [3]: tile(inx,(3,1))  #列3表现复制的行数 行1表现对inX的反复的次数    Out[3]:     array([[1, 2, 3],        [1, 2, 3],        [1, 2, 3]])    In [4]: tile(inx,(3,2)) #列3表现复制的行数 行2表现对inX的反复的次数    Out[4]:     array([[1, 2, 3, 1, 2, 3],        [1, 2, 3, 1, 2, 3],        [1, 2, 3, 1, 2, 3]])    '''    # tile天生和练习样本对应的矩阵,并与练习样本求差    diffMat = tile(inX, (dataSetSize, 1)) - dataSet    '''    欧氏间隔: 点到点之间的间隔       第一行: 同一个点 到 dataSet的第一个点的间隔。       第二行: 同一个点 到 dataSet的第二个点的间隔。       ...       第N行: 同一个点 到 dataSet的第N个点的间隔。    [[1,2,3],[1,2,3]]-[[1,2,3],[1,2,0]]    (A1-A2)^2+(B1-B2)^2+(c1-c2)^2    '''    # 取平方    sqDiffMat = diffMat ** 2    # 讲矩阵的每一行相加    sqDistances = sqDiffMat.sum(axis=1)    # 开方    distances = sqDistances ** 0.5    #print ('distances=', distances)    #distances= [1.3453624  1.27279221 0.14142136 0.1]    # 按照间隔排序从小到大的排序,返回对应的索引位置    sortedDistIndicies = distances.argsort()    #print ('distances.argsort()=', sortedDistIndicies)    #distances.argsort()= [3 2 1 0]    # 2. 挑选间隔最小的K个点    classCount = {}    for i in range(K):        #找到该样本的典范        voteIlabel = labels[sortedDistIndicies]        # 在字典中将该典范加一        # 字典的get方式        # 如:list.get(k,d) 其中 get相当于一条if...else...语句,参数k在字典中,字典将返回list[k];假如参数k不在字典中则返回参数d,假如K在字典中则返回k对应的value值        # l = {5:2,3:4}        # print l.get(3,0)返回的值是4;        # Print l.get(1,0)返回值是0;        classCount[voteIlabel] = classCount.get(voteIlabel, 0) + 1    #print(classCount)    #{'A': 1, 'B': 2}    # 3. 排序而且返回出现最多的那个数据典范    # 字典的 items() 方式,以列表返回可遍历的(键,值)元组数组。    # 例如:dict = {'Name': 'Zara', 'Age': 7}   print "Value : %s" %  dict.items()   Value : [('Age', 7), ('Name', 'Zara')]    # sorted 中的第2个参数 key=operator.itemgetter(1) 这个参数的意义是先比力第几个元素    # 例如:a=[('b',2),('a',1),('c',0)]  b=sorted(a,key=operator.itemgetter(1)) >>>b=[('c',0),('a',1),('b',2)] 可以看到排序是依照后边的0,1,2举行排序的,而不是a,b,c    # b=sorted(a,key=operator.itemgetter(0)) >>>b=[('a',1),('b',2),('c',0)] 此次比力的是前边的a,b,c而不是0,1,2    # b=sorted(a,key=opertator.itemgetter(1,0)) >>>b=[('c',0),('a',1),('b',2)] 这个是先比力第2个元素,然后对第一个元素举行排序,构成多级排序。    #我们现在需要出现次数最多的那个 所以利用reverse=True列表反向排序    sortedClassCount = sorted(classCount.items(), key=operator.itemgetter(1), reverse=True)    return sortedClassCount[0][0]def classify1(inX, dataSet, labels, K):    '''    inX: 用于分类的输入向量 输入的测试数据    dataSet:输入的练习样本    lables:标签向量    k:挑选近来邻人的数目 凡是小于20    留意:labels元素数目和dataSet行数类似;步伐利用欧式间隔公式.    猜测数据地点分类可在输入以下命令    kNN.classify0([0,0], group, labels, 3)    '''    # -----------实现 classify0() 方式的第二种方式----------------------------------------------------------------------------------------------------------------------------    # 欧氏间隔: 点到点之间的间隔    #    第一行: 同一个点 到 dataSet的第一个点的间隔。    #    第二行: 同一个点 到 dataSet的第二个点的间隔。    #    ...    #    第N行: 同一个点 到 dataSet的第N个点的间隔。    # [[1,2,3],[1,2,3]]-[[1,2,3],[1,2,0]]    # (A1-A2)^2+(B1-B2)^2+(c1-c2)^2        # inx - dataset 利用了numpy broadcasting,见 https://docs.scipy.org/doc/numpy-1.13.0/user/basics.broadcasting.html    # np.sum() 函数的利用见 https://docs.scipy.org/doc/numpy-1.13.0/reference/generated/numpy.sum.html    # """    dist = np.sum((inX - dataSet)**2, axis=1)**0.5        # """    # 2. k个近来的标签        # 对间隔排序利用numpy中的argsort函数, 见 https://docs.scipy.org/doc/numpy-1.13.0/reference/generated/numpy.sort.html#numpy.sort    # 函数返回的是索引,是以取前k个索引利用[0 : k]    # 将这k个标签存在列表k_labels中    # """   k_labels = [labels[index] for index in dist.argsort()[0 : K]]# """    # 3. 出现次数最多的标签即为终极种别        # 利用collections.Counter可以统计各个标签的出现次数,most_common返回出现次数最多的标签tuple,例如[('lable1', 2)],是以[0][0]可以取出标签值# """    label = Counter(k_labels).most_common(1)[0][0]    return labelif __name__ == '__main__':    test1()   
教你学Python26-knn临近算法  区块链


输入:dataSet:输入的练习样本[[1.0,1.1]  #标签对应A    [1.0,1.0]   #标签对应A    [0,    0]   #标签对应B    [0, 0.1]]  #标签对应Blables:标签向量    ['A', 'A', 'B', 'B']        inX: 用于分类的输入向量 输入的测试数据    [0.1, 0.1]输出:B说明这个输出的标签更靠近B 输入B类###具体先容看代码诠释哈
教你学Python26-knn临近算法  区块链




喜好点下关注,你的关注是我写作的最大支持


教你学Python26-knn临近算法  区块链


教你学Python26-knn临近算法  区块链




免责声明:假如加害了您的权益,请联系站长,我们会实时删除侵权内容,感谢合作!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Copyright © 2006-2014 如何炒外汇入门_外汇交易_外汇交易平台_外汇学习培训-【518外汇网】 版权所有 法律顾问:高律师 客服电话:0791-88289918
技术支持:迪恩网络科技公司  Powered by Discuz! X3.2
快速回复 返回顶部 返回列表