关于自定义kNN算法的构造函数

来源:4-2 scikit-learn中的机器学习算法封装

shurima阿慕慕

2020-03-08

老师好,在我们自己写的kNN算法中__ini__的参数只定义了k的值,但函数内部把另两个“私有变量”初始化为None,按我的理解进行实例化时构造函数应该是最先被调用的,为什么这两个私有变量不先放在构造函数的参数中呢?

写回答

1回答

liuyubobobo

2020-03-08

在这里,我遵守的是 sklearn 的机器学习算法类的设计方式,即:

构造函数只做算法初始化;

训练过程叫做 fit,才会对用户传来的 X_train 和 y_train 处理;

预测过程叫 predict。


后面你就会看到,我们设计的所有机器学习的算法类都将遵守这一模式,并且 sklearn 的所有机器学习算法类也都遵守这一模式。


具体为什么这么设计,这是一个设计问题。所谓设计问题,就是没有对错,只有合适不合适。


sklearn 采用这样的设计方式,是将模型的参数(比如 kNN 中的 k)和数据集解耦。换句话说,我们创建的是一个 k 为 3 的 kNN 算法类,后续,用户可以在这个算法类中,传入任意的 X_train 和 y_train,更换 X_train 和 y_train;

而不是创建了一个 k 为 3,并且只能计算某一组 X_train 和 y_train 的算法类。


继续加油!:) 

1
3
liuyubobobo
回复
手中的铅笔
装饰器属于高阶函数,可能看函数式编程有意义。具体设计,如果真要说理论,就是设计模式那一套,但其实实践最重要,多看优秀的开源框架或者类库的设计方式。其实,学习一个框架的过程,不仅仅是在学习怎么使用它,也是在学习它的设计方式。继续加油!:)
2020-09-13
共3条回复

Python3入门机器学习 经典算法与应用  

Python3+sklearn,兼顾原理、算法底层实现和框架使用。

5893 学习 · 2454 问题

查看课程