# K近邻算法的Python实现

KNN算法的直观理解

（添加一个直观的图）

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

K的选择；

KNN算法的原理

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

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

K的选择

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

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

KNN算法的优缺点

.

KNN算法的算法实现

importosos.chdir('D:\\my_python_workfile\\Project\\Writting')os.getcwd()

'D:\\my_python_workfile\\Project\\Writting'

#defmajority_vote(labels):"""assumes that labels are ordered from nearest to farthest """vote_counts=Counter(labels)winner,winner_count=vote_counts.most_common(1)[]num_winners=len([countforcountinvote_counts.values()ifcount==winner_count])ifnum_winners==1:returnwinnerelse:returnmajority_vote(labels[:-1])# try again wthout the farthest

# define distance functionimportmath#### 减法定义defvector_substract(v,w):"""substracts coresponding elements"""return[v_i-w_iforv_i,w_iinzip(v,w)]defsquared_distance(v,w):""""""returnsum_of_squares(vector_substract(v,w))defdistance(v,w):returnmath.sqrt(squared_distance(v,w))########################################### define sum_of_squares### 向量的点乘defdot(v,w):returnsum(v_i*w_iforv_i,w_iinzip(v,w))### 向量的平房和defsum_of_squares(v):"""v_1*v_1+v_2*v_2+...+v_n*v_n"""returndot(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 farthestby_distance=sorted(labeled_points,key=lambda(point,_):distance(point,new_point))# find the labels for the k cloestk_nearest_labels=[labelfor_,labelinby_distance[:k]]# and let them votereturnmajority_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)forlongitude,latitude,languageincities]

# plot_state_bordersimportresegments=[]points=[]lat_long_regex=r"

# 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),languageincities:plots[language][].append(logitude)plots[language][1].append(latitude)# create a scatter series for each languageforlanguage,(x,y)inplots.iteritems():plt.scatter(x,y,color=colors[language],marker=markers[language],label=language,zorder=10)plot_state_borders(plt)plt.legend(loc=)plt.axis([-130,-60,20,55])plt.title("Favorite Programming Languages")plt.show()

# try several different values for kforkin[1,3,5,7]:num_correct=forcityincities:location,actual_language=cityother_cities=[other_cityforother_cityincitiesifother_city!=city]predicted_language=knn_classify(k,other_cities,location)ifpredicted_language==actual_language:num_correct+=1printk,"neighbor[s]:",num_correct,"correct out of ",len(cities)

1neighbor[s]:40correct outof753neighbor[s]:44correct outof755neighbor[s]:41correct outof757neighbor[s]:35correct outof75

Grus J. Data Science from Scratch: First Principles with Python[M]. “ O’Reilly Media, Inc.”, 2015.

0 条评论

• ### 机器学习巅峰之战，python最火，R最具潜力

关于哪种语言更适合数据科学的问题有一个非常热门的争论：R还是Python。答案是两个。人们经常比较R和Python的特性而感到困惑，但我们需要明白，单靠功能本身...

• ### Python的新手指南，教你如何变编程大佬级别的

新的Python？下面是基础知识的细分，包括语言的历史，使用者的语言以及Python 2与3的区别。 Python是一种编程语言，对于编写快速而简单的脚本非常有...

• ### Python编程语言主要应用在什么领域

Python是一个简洁优美又设计优秀的编程语言，所以在使用它的领域非常的广泛。Python可以完成现实中的各种任务，减少开发者们日复一日所做的重复事情。Pyth...

• ### 研究深度学习的开发者，需要对 Python 掌握哪些知识？

今天是918，一个对中国人来说非常特殊的日子。这一天，有些地方可能会拉响警笛，有的地方可能会有一些纪念活动。

• ### 夯实Python基础（7）

Python标准库，是Python程序员应该熟悉了解的又一个宝库。Python 标准库非常庞大，所提供的组件涉及范围十分广泛。简要描述如下：

• ### CentOS 7中 Minimal 安装JDK 1.8的教程

最近没有项目做，比较空闲，小编打算在linux 的CentOS 7 Minimal版本试着搭建hadoop环境学习学习，当然第一步就是在CentOS 7 Min...

• ### 【强强联合】在Power BI 中使用Python（1）

近几年，Python是越来越火了，就连地产大佬潘石屹都在年近不惑之时开始学习Python编程语言，我们做数据分析和运营的怎能不熟练运用呢？

• ### VS Code＋Anaconda打造舒适的Python环境

最近一直在用Anaconda编写代码，但是呢感觉对于调试不太方便，另外Anaconda更偏向于数据分析，对于Python可能更对人偏向于PyChram，但是我的...

• ### 关于机器学习，这可能是目前最全面最无痛的入门路径和资源！

之前搞机器学习的那帮人都喜欢用Python，所以Python慢慢就积攒了很多优秀的机器学习库，所谓的库，你就理解为别人封装好的一些具有某些功能的模块，我们可以通...