凌云时刻 · 技术
导读:上一篇笔记主要介绍了NumPy,Matplotlib和Scikit Learn中Datasets三个库的用法,以及基于欧拉定理的kNN算法的基本实现。这一篇笔记的主要内容是通过PyCharm封装kNN算法并且在Jupyter Notebook中调用,以及计算器算法的封装规范,kNN的k值如何计算,如何使用Scikit Learn中的kNN算法。
作者 | 计缘
来源 | 凌云时刻(微信号:linuxpk)
封装kNN算法
上一篇笔记中我们对kNN算法在Jupyter Notebook中进行了实现,但是想要复用这个算法就很不方便,所以我们来看看如何在PyCharm中封装算法,并且在Jupyter Notebook中进行调用。
PyCharm的配置这里我就不再累赘,如图所示,我们创建了一个Python文件kNN.py
,然后定义了kNNClassify
方法,该方法有4个参数,分别是kNN算法的k
值,训练样本特征数据集XTrain
,训练样本类别数据集yTrain
,预测特征数据集x
。该方法中的实现和在Jupyter Notebook中实现的一模一样,只不过加了三个断言,让方法的健壮性更好一点。我们给出N维欧拉定理:
# kNN.py
import numpy as np
from math import sqrt
from collections import Counter
def kNNClassify(k, XTrain, yTrain, x):
assert 1 = self.k, \
"训练样本特征数据集的行数,既样本点的数量要大于等于k值"
self._XTrain = XTrain
self._yTrain = yTrain
return self
# 输入样本数据,根据模型进行预测
def predict(self, XPredict):
assert self._XTrain is not None and self._yTrain is not None, \
"在执行predict方法前必须先执行fit方法"
assert XPredict.shape[1] == self._XTrain.shape[1], \
"被预测数据集的特征数,既列数必须与模型数据集中的特征数相同"
ypredict = [self._predict(x) for x in XPredict]
return np.array(ypredict)
# 实现私有的预测方法,kNN算法的核心代码
def _predict(self, x):
assert x.shape[0] == self._XTrain.shape[1], \
"输入的样本数据的特征数量必须等于模型数据,既训练样本数据的特征数量"
distance = [sqrt(np.sum((xTrain - x) ** 2)) for xTrain in self._XTrain]
nearest = np.argsort(distance)
topK = [self._yTrain[i] for i in nearest[:self.k]]
votes = Counter(topK)
return votes.most_common(1)[0][0]
def __repr__(self):
return "kNN(k=%d)" % self.k
上面的代码清晰的定义了fit
和predict
方法,至于_predict
这个私有方法可以随意,可以将逻辑直接写在predict
方法里,也可以拆分出来。然后我们在Jupyter Notebook中再来使用一下我们封装的kNN算法:
%run ../pycharm/kNN/kNN.py
myKNNClassifier = KNNClassifier(6)
myKNNClassifier.fit(XTrain, yTrain)
# 结果
kNN(k=6)
xTrain = x.reshape(1, -1)
myKNNClassifier.predict(xTrain)
# 结果
array([1])
判断机器学习算法的性能
现在大家应该知道机器算法的目的主要是训练出模型,然后输入样本,通过模型来预测结果,可见这个模型是非常关键的,模型的好坏直接影响预测结果的准确性,继而对实际运用会产生巨大的影响。模型的训练除了机器学习算法以外,对它影响比较大的还有训练样本数据,我们在实现kNN算法时,是将所有的样本数据用于训练模型,那么模型训练出来后就已经没有数据供我们验证模型的好坏了,只能直接投入真实环境使用,这样的风险是很大的。
所以为了避免上述这种情况,最简单的做法是将所有训练样本数据进行切分,将大部分数据用于训练模型,而另外一小部分数据用来测试训练出的模型,这样如果我们用测试数据发现这个模型不够好,那么我们就有机会在将模型投入真实环境使用之前改进算法,训练出更好的模型。
我们来看看如何封装拆分训练数据的方法:
import numpy as np
# 训练样本数据 X 和 y 按照 test_radio 分割成 X_train, y_train, X_test, y_test
def train_test_split(X, y, test_radio = 0.2, seed = None):
assert X.shape[0] == y.shape[0], \
"训练样本特征数据集的行数要与训练样本分类结果数据集的行数相同"
assert 0.0
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?


微信扫码登录