本篇博客致力于讲解在PyCharm中以函数化封装代码并在JupyterNoteBook中调用的技巧,通过本篇博客的学习,以KNN算法为例,意在用通俗易懂的语言掌握函数化代码的技巧。通读本篇博客大概需要5分钟左右的时间。
注:本篇博客的内容是基于liuyubobobo老师讲解的机器学习课程为基础,加上本人的总结和思考制作出来的,更详细的原版视频请自行搜索bobo老师机器学习。
上一篇讲解KNN算法(KNN算法博客地址),在jupyterNotebook中通过python语言实现了其核心的算法逻辑。但为了之后我们能够方便的调用此算法逻辑,我们以面向对象的思想,专门创建一个文件,然后通过文件中的方法封装KNN核心算法代码。
我们仔细的可以发现,在JupyterNoteBook中新建的File的后缀名是ipynb,但我们创建的文件后缀名应该为py。总体思路是,我们通过Pycharm定义好文件和函数,然后通过jupyterNoteBook的upload功能上传到jupyter上去,即可完成对代码的封装。
我们以上篇博客KNN算法核心代码为例,在PyCharm中新建一个名为knn.py的文件,定义一个名为kNN_classify的函数(方法),将KNN核心算法代码写入在此方法中,完成对代码的封装。如下图所示:
在主文件的同级目录中,我们新建一个名为kNN_function的文件夹,然后进入此文件夹,通过upload按钮,找到我们之前编写knn.py的目录,上传到jupyter服务器中,具体操作如下图所示:
新建一个文件夹,具体操作如下:
修改文件夹的名字为kNN_function,操作如下图:
进入到此文件夹中,通过upload找到knn.py文件所在位置并upload到jupyterNoterbook服务中,如下图所示:
至此,我们已经将knn.py上传到jupyter服务器上。
我们在主文件中通过引入knn.py,然后就可以调用其kNN_classify方法,达到和上一篇博客一样的效果,具体整块代码如下所示:
import numpy as np import matplotlib.pyplot as plt raw_data_X = [[3.393533211, 2.331273381], [3.110073483, 1.781539638], [1.343808831, 3.368360954], [3.582294042, 4.679179110], [2.280362439, 2.866990263], [7.423436942, 4.696522875], [5.745051997, 3.533989803], [9.172168622, 2.511101045], [7.792783481, 3.424088941], [7.939820817, 0.791637231] ] raw_data_y = [0, 0, 0, 0, 0, 1, 1, 1, 1, 1] X_train = np.array(raw_data_X) y_train = np.array(raw_data_y) x = np.array([8.093607318, 3.365731514]) %run kNN_function/knn.py # 引入knn.py文件 predict_y = kNN_classify(6, X_train, y_train, x) # 调用kNN_classify方法 predict_y
knn.py文件中的代码:
import numpy as np from math import sqrt from collections import Counter def kNN_classify(k, X_train, y_train, x): assert 1 <= k <= X_train.shape[0], "k must be valid" assert X_train.shape[0] == y_train.shape[0], \ "the size of X_train must equal to the size of y_train" assert X_train.shape[1] == x.shape[0], \ "the feature number of must be equal to X_train" distances = [sqrt(np.sum((x_train - x) ** 2)) for x_train in X_train] nearest = np.argsort(distances) topK_y = [y_train[i] for i in nearest[:k]] votes = Counter(topK_y) return votes.most_common(1)[0][0]
通过本篇博客,主要讲解了如何通过PyCharm函数化封装代码,并在jupyter服务器中调用,函数化封装对于管理代码有很大的帮助。下一篇博客,介绍Scikit-Learn当中封装的KNN算法,并通过函数化封装代码形式自己实现简单的Scikit-Learn底层KNN算法。如有错误,欢迎大家指正,谢谢