请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

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

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

正在回答

1回答

liuyubobobo 2020-03-08 11:23:07

在这里,我遵守的是 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 回复 有任何疑惑可以回复我~
  • 提问者 shurima阿慕慕 #1
    明白了!谢谢老师
    回复 有任何疑惑可以回复我~ 2020-03-08 19:11:05
  • 看到老师这个回答竟有一丝心动的感觉,老师你啥时候也开一门和设计相关的课程,这方面我相信很多人都欠缺。或者老师,你觉得怎样提升这方面的设计能力,有没有什么学习路线或者相关的资料推荐?最近我学 Python 的时候,学到装饰器那块就有点蒙逼了,真是看不太懂,高级的知识点感觉不是仅仅懂整个程序的执行流程就能明白的。
    回复 有任何疑惑可以回复我~ 2020-09-13 11:28:05
  • 装饰器属于高阶函数,可能看函数式编程有意义。具体设计,如果真要说理论,就是设计模式那一套,但其实实践最重要,多看优秀的开源框架或者类库的设计方式。其实,学习一个框架的过程,不仅仅是在学习怎么使用它,也是在学习它的设计方式。继续加油!:)
    回复 有任何疑惑可以回复我~ 2020-09-13 13:55:15
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信