【4-3】训练数据集,测试数据集
来源:4-4 分类准确度
刘刘刘刘刘英迪
2020-04-06
亲爱的老师:bo~ bo~ bo~
我在思考kNN算法的时间复杂度的问题,给定规模为n、具有m个特征的数据集,预测规模为1的输入,不考虑排序的话,时间复杂度肯定为O(n * m)。但是其中有个排序取distances最小值索引操作 np.argsort(distances)。
我想请教下:
(1)这个np.argsort的时间复杂度是多少呢?这个是不是要考虑进去?
(2)我是做java的(bobo老师应该精通java比python更甚,命名上看得出来…),感觉python底层没有java那么显而易见,也看不太懂np.argsort底层代码。老师平时看python底层,都是怎么做的呢?分享分享呗?
继续加油!:)
1回答
-
1
np.argsort 的时间复杂度是 O(nlogn),应该把这个复杂度考虑进去。
2
我没有研究过 numpy 的源码,刚才简单看了一下,我想关键还是在于包装的层次太多,导致不好理解。
对于 numpy 来说,它不仅仅是简单处理一维数组,他要处理高维数组的情况;它不仅仅只是处理数字,他要处理复数的情况;它还要考虑 nan 等特殊的边界,等等等,更不用提 numpy 还包装了诸如 masked array 等等更多的概念。这些集合在一起,使得核心算法隐藏在很深的地方,外面包含有大量的预处理内容。这些内容必须了解整个源码的设计模式才能理解。numpy 官方的这份文档是了解 numpy 整体设计架构的好地方:https://github.com/numpy/numpy/tree/master/doc/source/reference
更重要的是,为了性能考虑,numpy 底层完全是使用 C 语言写的,py 只不过是一层上层的包装。所以,很多核心函数,都要到底层 C 语言部分找。比如你说的 argsort,我溯源了一下,它的核心调用在这里:https://github.com/numpy/numpy/blob/master/numpy/core/src/multiarray/methods.c 注意,这是一个 C 代码,1378 行的位置。
其中调用的 PyArray_ArgSort,核心实现在这里:https://github.com/numpy/numpy/blob/master/numpy/core/src/multiarray/item_selection.c 1389 的位置。这里还是 C 代码。
在这里,你就可以看到我们熟悉的排序算法的名字了。这些排序算法的实现在这里:https://github.com/numpy/numpy/tree/master/numpy/core/src/npysort 还是 C 代码。
整体,numpy,包括 sklearn 等库,我认为不是特别适合做底层源码学习。实际上我平时很少看 Python 的这种库的源码,这和 Java 的标准库实现,或者 Java 的某个框架的源码,或者安卓某个组件的源码,完全不是一回事儿。当然,如果感兴趣,研究一下挺好,但恐怕和机器学习没什么关系,而且也超出我的能力范围了。
继续加油!:)
212020-04-07
相似问题