0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

学习KNN算法的基本原理,并用Python实现该算法以及阐述其应用价值

lviY_AI_shequ 2018-01-02 14:56 次阅读

作为『十大机器学习算法』之一的K-近邻(K-Nearest Neighbors)算法是思想简单、易于理解的一种分类和回归算法。今天,我们来一起学习KNN算法的基本原理,并用Python实现该算法,最后,通过一个案例阐述其应用价值。

KNN算法的直观理解

(添加一个直观的图)

它基于这样的简单假设:彼此靠近的点更有可能属于同一个类别。用大俗话来说就是『臭味相投』,或者说『近朱者赤,近墨者黑』。

它并未试图建立一个显示的预测模型,而是直接通过预测点的临近训练集点来确定其所属类别。

K近邻算法的实现主要基于三大基本要素:

K的选择;

距离度量方法的确定;

分类决策规则。

下面,即围绕这三大基本要素,探究它的分类实现原理。

KNN算法的原理

算法步骤

K近邻算法的实施步骤如下:

根据给定的距离度量,在训练集TT中寻找出与xx最近邻的kk个点,涵盖这kk个点的xx的邻域记作Nk(x)Nk(x);

在Nk(x)Nk(x)中根据分类决策规则决定样本的所属类别yy:

y=argmaxcj∑xi∈Nk(x)I(yi=cj),i=1,2,⋯,N;j=1,2,⋯,K.y=argmaxcj∑xi∈Nk(x)I(yi=cj),i=1,2,⋯,N;j=1,2,⋯,K.

K的选择

K近邻算法对K的选择非常敏感。K值越小意味着模型复杂度越高,从而容易产生过拟合;K值越大则意味着整体的模型变得简单,学习的近似近似误差会增大。

在实际的应用中,一般采用一个比较小的K值。并采用交叉验证的方法,选取一个最优的K值。

距离度量

距离度量一般采用欧式距离。也可以根据需要采用LpLp距离或明氏距离。

分类决策规则

K近邻算法中的分类决策多采用多数表决的方法进行。它等价于寻求经验风险最小化。

但这个规则存在一个潜在的问题:有可能多个类别的投票数同为最高。这个时候,究竟应该判为哪一个类别?

可以通过以下几个途径解决该问题:

从投票数相同的最高类别中随机地选择一个;

通过距离来进一步给票数加权;

减少K的个数,直到找到一个唯一的最高票数标签。

KNN算法的优缺点

优点

精度高

对异常值不敏感

没有对数据的分布假设

缺点

计算复杂度高

在高维情况下,会遇到『维数诅咒』的问题

KNN算法的算法实现

import os os.chdir('D:\\my_python_workfile\\Project\\Writting')os.getcwd()'D:\\my_python_workfile\\Project\\Writting'from __future__ import divisionfrom collections import Counter#from linear_algebra import distance#from statistics import meanimport math, randomimport matplotlib.pyplot as plt# 定义投票函数defraw_majority_vote(labels): votes = Counter(labels) winner,_ = votes.most_common(1)[0] return winner

以上的投票函数存在潜在的问题:有可能多个类别的投票数同为最高。

下面的函数则实现了解决方案中的第三种分类决策方法。

# defmajority_vote(labels): """assumes that labels are ordered from nearest to farthest """ vote_counts = Counter(labels) winner,winner_count = vote_counts.most_common(1)[0] num_winners = len([count for count in vote_counts.values() if count == winner_count]) if num_winners == 1: return winner else: return majority_vote(labels[:-1]) # try again wthout the farthest# define distance functionimport math#### 减法定义defvector_substract(v,w): """substracts coresponding elements""" return [v_i - w_i for v_i,w_i in zip(v,w)]defsquared_distance(v,w): """""" return sum_of_squares(vector_substract(v,w))defdistance(v,w): return math.sqrt(squared_distance(v,w))########################################### define sum_of_squares### 向量的点乘defdot(v,w): return sum(v_i * w_i for v_i,w_i in zip(v,w))### 向量的平房和defsum_of_squares(v): """v_1*v_1+v_2*v_2+...+v_n*v_n""" return dot(v,v)# classifierdefknn_classify(k,labeled_points,new_point): """each labeled point should be a pair (point,label)""" # order the labeled points from nearest to farthest by_distance = sorted(labeled_points, key = lambda (point,_):distance(point,new_point)) # find the labels for the k cloest k_nearest_labels = [label for _,label in by_distance[:k]] # and let them vote return majority_vote(k_nearest_labels)KNN算法的应用:案例分析# cities = [(-86.75,33.5666666666667,'Python'),(-88.25,30.6833333333333,'Python'),(-112.016666666667,33.4333333333333,'Java'), (-110.933333333333,32.1166666666667,'Java'),(-92.2333333333333,34.7333333333333,'R'),(-121.95,37.7,'R'), (-118.15,33.8166666666667,'Python'), (-118.233333333333,34.05,'Java'),(-122.316666666667,37.8166666666667,'R'), (-117.6,34.05,'Python'),(-116.533333333333,33.8166666666667,'Python'), (-121.5,38.5166666666667,'R'),(-117.166666666667,32.7333333333333,'R'),(-122.383333333333,37.6166666666667,'R'), (-121.933333333333,37.3666666666667,'R'),(-122.016666666667,36.9833333333333,'Python'), (-104.716666666667,38.8166666666667,'Python'),(-104.866666666667,39.75,'Python'),(-72.65,41.7333333333333,'R'), (-75.6,39.6666666666667,'Python'),(-77.0333333333333,38.85,'Python'),(-80.2666666666667,25.8,'Java'), (-81.3833333333333,28.55,'Java'),(-82.5333333333333,27.9666666666667,'Java'),(-84.4333333333333,33.65,'Python'), (-116.216666666667,43.5666666666667,'Python'),(-87.75,41.7833333333333,'Java'),(-86.2833333333333,39.7333333333333,'Java'), (-93.65,41.5333333333333,'Java'),(-97.4166666666667,37.65,'Java'),(-85.7333333333333,38.1833333333333,'Python'), (-90.25,29.9833333333333,'Java'),(-70.3166666666667,43.65,'R'),(-76.6666666666667,39.1833333333333,'R'), (-71.0333333333333,42.3666666666667,'R'),(-72.5333333333333,42.2,'R'),(-83.0166666666667,42.4166666666667,'Python'), (-84.6,42.7833333333333,'Python'),(-93.2166666666667,44.8833333333333,'Python'),(-90.0833333333333,32.3166666666667,'Java'), (-94.5833333333333,39.1166666666667,'Java'),(-90.3833333333333,38.75,'Python'),(-108.533333333333,45.8,'Python'), (-115.166666666667,36.0833333333333,'Java'),(-71.4333333333333,42.9333333333333,'R'),(-74.1666666666667,40.7,'R'), (-106.616666666667,35.05,'Python'),(-78.7333333333333,42.9333333333333,'R'),(-73.9666666666667,40.7833333333333,'R'), (-80.9333333333333,35.2166666666667,'Python'),(-78.7833333333333,35.8666666666667,'Python'),(-100.75,46.7666666666667,'Java'), (-84.5166666666667,39.15,'Java'),(-81.85,41.4,'Java'),(-82.8833333333333,40,'Java'),(-97.6,35.4,'Python'), (-122.666666666667,45.5333333333333,'Python'),(-75.25,39.8833333333333,'Python'),(-80.2166666666667,40.5,'Python'), (-71.4333333333333,41.7333333333333,'R'),(-81.1166666666667,33.95,'R'),(-96.7333333333333,43.5666666666667,'Python'), (-90,35.05,'R'),(-86.6833333333333,36.1166666666667,'R'),(-97.7,30.3,'Python'),(-96.85,32.85,'Java'), (-98.4666666666667,29.5333333333333,'Java'),(-111.966666666667,40.7666666666667,'Python'),(-73.15,44.4666666666667,'R'), (-77.3333333333333,37.5,'Python'),(-122.3,47.5333333333333,'Python'),(-95.9,41.3,'Python'),(-95.35,29.9666666666667,'Java'), (-89.3333333333333,43.1333333333333,'R'),(-104.816666666667,41.15,'Java')]cities = [([longitude,latitude],language) for longitude,latitude,language in cities]# plot_state_bordersimport resegments = []points = []lat_long_regex = r""): for p1, p2 in zip(points, points[1:]): segments.append((p1, p2)) points = [] s = re.search(lat_long_regex, line) if s: lat, lon = s.groups() points.append((float(lon), float(lat)))defplot_state_borders(plt, color='0.8'): for (lon1, lat1), (lon2, lat2) in segments: plt.plot([lon1, lon2], [lat1, lat2], color=color)# key is language, value is pairplots = {"Java":([],[]),"Python":([],[]),"R":([],[])}#mark and colormarkers = {"Java":"o","Python":"s","R":"^"}colors = {"Java":"r","Python":"b","R":"g"}for (logitude,latitude),language in cities: plots[language][0].append(logitude) plots[language][1].append(latitude) # create a scatter series for each languagefor language,(x,y) in plots.iteritems(): plt.scatter(x,y,color = colors[language],marker = markers[language],label = language,zorder = 10) plot_state_borders(plt)plt.legend(loc = 0)plt.axis([-130,-60,20,55])plt.title("Favorite Programming Languages")plt.show()

学习KNN算法的基本原理,并用Python实现该算法以及阐述其应用价值

# try several different values for kfor k in [1,3,5,7]: num_correct = 0 for city in cities: location,actual_language = city other_cities = [other_city for other_city in cities if other_city != city] predicted_language = knn_classify(k,other_cities,location) if predicted_language == actual_language: num_correct += 1 print k,"neighbor[s]:",num_correct,"correct out of ",len(cities)1 neighbor[s]: 40 correct out of 753 neighbor[s]: 44 correct out of 755 neighbor[s]: 41 correct out of 757 neighbor[s]: 35 correct out of 75

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • python
    +关注

    关注

    51

    文章

    4667

    浏览量

    83443
  • KNN算法
    +关注

    关注

    0

    文章

    2

    浏览量

    6118

原文标题:K近邻算法的Python实现

文章出处:【微信号:AI_shequ,微信公众号:人工智能爱好者社区】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    蚁群算法基本原理及其应用实例

    与遗传算法设计的结果进行了比较,数值仿真结果表明,蚁群算法具有一种新的模拟进化优化方法的有效性和应用价值。本文详细介绍了蚁群算法基本原理及其
    发表于 02-02 09:44 9.1w次阅读
    蚁群<b class='flag-5'>算法</b><b class='flag-5'>基本原理</b>及其应用实例

    FFT的基本原理算法结构

    FFT的基本原理算法结构FFT是利用了旋转因子的周期性和对称性,对DFT进行简化的运算。各种FFT算法可分两大类:一类是针对N等于2的整数次幂的算法,如基二
    发表于 06-14 00:20

    遗传算法基本原理

    遗传算法基本原理.zip
    发表于 01-07 12:13

    Python实现k-近邻算法

    算法。5、测试算法:计算错误率。6、使用算法:首先需要输入样本数据和结构化的输出结果,然后运行k-近邻算法判定输入数据分别属于哪个分类,最后应用对计算出的分类执行后续的处理。关于k-近
    发表于 10-10 10:32

    KNN算法原理

    KNN(K近邻算法
    发表于 11-01 09:14

    KNN分类算法python代码实现

    kNN分类算法Python实现
    发表于 06-05 12:02

    视频增强算法基本原理是什么?

    视频增强算法基本原理是什么?单尺度算法的原理是什么?视频增强能解决的实际问题及应用领域
    发表于 06-03 07:14

    PID算法基本原理及其执行流程

    景。1、PID算法基本原理PID算法是控制行业最经典、最简单、而又最能体现反馈控制思想的算法。对于一般的研发人员来说,设计和实现PID
    发表于 12-21 08:22

    Python实现k-近邻算法

    算法。5、测试算法:计算错误率。6、使用算法:首先需要输入样本数据和结构化的输出结果,然后运行k-近邻算法判定输入数据分别属于哪个分类,最后应用对计算出的分类执行后续的处理。关于k-近
    发表于 01-04 14:03

    利用KNN算法实现基于系统调用的入侵检测技术

    该算法来自一种文本分类算法-KNN 算法,文中给出了用该算法实现的入侵检测系统模型.利用
    发表于 06-13 11:01 18次下载

    LSB算法基本原理

    LSB算法基本原理LSB算法基本原理是:对空域的LSB做替换,用来替换LSB的序列就是需要加入的水印信息、水印的数字摘要或者由水印生成的伪随机序列。由于水
    发表于 12-09 02:41 7168次阅读

    蚁群算法python编程实现

    本文主要介绍了Python编程实现蚁群算法详解,涉及蚂蚁算法的简介,主要原理及公式,以及Python
    发表于 02-02 10:36 7275次阅读
    蚁群<b class='flag-5'>算法</b><b class='flag-5'>python</b>编程<b class='flag-5'>实现</b>

    关联规则挖掘——Apriori算法基本原理以及改进

    本文详细介绍了关于关联规则挖掘——Apriori算法基本原理以及改进。
    发表于 02-02 16:46 9172次阅读
    关联规则挖掘——Apriori<b class='flag-5'>算法</b>的<b class='flag-5'>基本原理</b><b class='flag-5'>以及</b>改进

    蚁群算法基本原理及其改进算法.ppt

    蚁群算法基本原理及其改进算法.ppt
    发表于 04-23 14:28 6次下载
    蚁群<b class='flag-5'>算法</b>的<b class='flag-5'>基本原理</b>及其改进<b class='flag-5'>算法</b>.ppt

    详解机器学习分类算法KNN

    本文主要介绍一个被广泛使用的机器学习分类算法,K-nearest neighbors(KNN),中文叫K近邻算法
    的头像 发表于 10-31 17:18 5693次阅读