如何解决如何应用计算复杂性理论
我掌握了计算复杂性理论的基础知识。我能理解为什么我可能想用一种算法进行扩展而不是另一种。现在,我在那里如何真正确定所创建函数的复杂性?我如何理解要使用哪些功能,哪个功能可以更好地扩展?例如,如何在审判外得知Telephone Book binary search采用O(log n )表示法,或者Fibonacci sequence采用O(n ^ 2)表示法和错误?如何确定scikit-learn等功能的复杂性?
我该如何实际应用这些东西?
解决方法
在scikit-learn
中执行的任务具有很高的计算能力,这就是为什么建议为运行ML / DS相关任务获得良好的GPU的原因。所有这些任务都是使用内核/线程并行运行的。
因此,很难确定这些函数的实际复杂度是什么,但是我们可以做的就是测试运行并检查给定长度的输入要花费多少时间。
请参阅here,以便更好地理解。
,基本上,您需要计算算法所需的操作数 取决于输入大小。那么Big O只是表达式的最高阶部分,而常量因子则被忽略。
只要操作时间恒定,就不会在意操作的种类(比较,分配等)。
对于复杂的算法,该分析可能很困难。
对于二进制搜索:在每个搜索步骤中,要搜索的值的数量减少为一半。因此,两次输入需要再执行一个搜索步骤(操作)。
t(2n) = 1 + t(n)
。这导致t(n) = c ld n = O(log n)
,至少是2的幂。对于其他n
,表达式更复杂,但是最高阶部分仍然是c ld n
。
对于斐波那契:天真的,递归的实现要求您计算fib(n-1)
和fib(n-2)
以计算fib(n)
。因此,您计算fib(n-2)
两次,fib(n-3)
三次,fib(n-4)
五次,依此类推(遵循斐波那契数列本身)。因此,要执行的计算数量为1 + 1 + 2 + 3 + 5 + ... + fib(n - 1) = fib(n) - 1
。由于我们对渐近行为感兴趣(对于大n
),我们可以应用渐近近似公式:
这意味着朴素的递归斐波那契数为O(a ^ n),即指数复杂度。
更好的算法从斐波那契数列的开头开始,并且每个数字都计算一次。这显然是O(n),因为它需要n
(或n - 2
)相等的步长。
scikit-learn是基于数值优化的(但不仅是:例如,kd树可能更像是一种计算机科学算法),并且确实需要经典的以计算机科学为中心的计算复杂性处理方法,但还不够。
对于诸如内点求解器或基于坐标下降的SVM求解器(ML算法背后的两个概念示例)之类的东西,它们都是迭代方法,就像num-opt中的几乎所有事物一样,不需要知道您有多快可以进行二分查找,但更重要的是要知道算法需要进行多少次迭代或更具体:算法如何在优化空间中移动。这非常困难,取决于数据(例如成本函数的粗麻布的特征值),并且证明/分析很大程度上基于数学:例如度量理论。
当试探法发挥作用时,情况甚至更糟(而且很常见)。
所以基本上:对于合理的复杂算法,您将无法做到这一点。
您应该做什么:
- 检查文档/资料中使用了哪种算法,并找到基础的研究论文和分析以获得诸如“样本空间中的立方”之类的东西
- 使用您的数据 进行实证分析
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。