Math 如何矢量化方程?

Math 如何矢量化方程?,math,machine-learning,regression,glm,Math,Machine Learning,Regression,Glm,在看了Andrew Ng教授关于GLM的讲座后,我试图实现Softmax回归算法来解决K分类器问题。我以为我理解了他所说的一切,直到最后编写代码来实现Softmax回归的成本函数,如下所示: 我遇到的问题是试图找出一种将其矢量化的方法。我又一次认为我理解了如何像这样对方程进行向量化,因为我能够对线性回归和逻辑回归进行向量化,但是在看了这个公式之后,我被卡住了 虽然我很想找到一个向量化的解决方案(我意识到已经发布了一个类似的问题:),但我更感兴趣的是你们中是否有人能告诉我一种方法(你们的方法)来

在看了Andrew Ng教授关于GLM的讲座后,我试图实现Softmax回归算法来解决K分类器问题。我以为我理解了他所说的一切,直到最后编写代码来实现Softmax回归的成本函数,如下所示:

我遇到的问题是试图找出一种将其矢量化的方法。我又一次认为我理解了如何像这样对方程进行向量化,因为我能够对线性回归和逻辑回归进行向量化,但是在看了这个公式之后,我被卡住了

虽然我很想找到一个向量化的解决方案(我意识到已经发布了一个类似的问题:),但我更感兴趣的是你们中是否有人能告诉我一种方法(你们的方法)来有系统地将这样的方程转换成向量化的形式。例如,对于那些ML方面的专家或经验丰富的老手,当您第一次阅读文献中的新算法时,看到它们以类似于上面等式的符号书写,您如何将它们转换为矢量化形式

我意识到我可能会像一个学生问莫扎特,“你怎么弹得这么好?”但我的问题仅仅是出于想更好地掌握这种材料的愿望,并假设不是每个人生来就知道如何矢量化方程,所以一定有人设计了自己的系统,如果是,请分享!非常感谢


干杯

这一个看起来很难矢量化,因为你在求和中做指数运算。我想你是在把e提升到武断的程度。可以矢量化的是表达式\sum\sum theta^2的第二项,请确保使用matlab中的。*运算符来计算\theta^2

这同样适用于进入对数的比率的内部项\θ'x^(i)是可向量化的表达式

您还可能受益于记忆或动态编程技术,并尝试重用e^\theta'x^(i)的计算结果


根据我的经验,向量化的方法通常是首先让非向量化的实现工作。然后尝试将计算中最明显的部分矢量化。在每一步都要对你的函数进行很少的调整,并经常检查你是否得到与非矢量化计算相同的结果。另外,拥有多个测试用例非常有用。

Octave附带的帮助文件有以下条目:

19.1基本矢量化 对于一个非常好的第一近似,矢量化的目标是 编写避免循环并使用整个数组操作的代码。作为一个 考虑一个简单的例子

 for i = 1:n
   for j = 1:m
     c(i,j) = a(i,j) + b(i,j);
   endfor
 endfor
相比之下,更简单

 c = a + b;
这不仅仅是写起来容易;它在内部也更容易实现 优化倍频程将此操作委托给基础 在其他优化中,可以使用特殊向量的实现 硬件指令,甚至可以想象执行中的添加 平行的通常,如果代码是矢量化的,则底层 实现对于它可以在中做出的假设有更多的自由度 以实现更快的执行

这对于具有“廉价”实体的循环尤其重要。经常 只需将最内部的循环矢量化即可获得可接受的结果 演出一般的经验法则是 矢量化实体应大于或等于 封闭循环

作为一个不那么琐碎的例子

 for i = 1:n-1
   a(i) = b(i+1) - b(i);
 endfor
 for i = 1:n
   if (a(i) > 5)
     a(i) -= 20
   endif
 endfor

这显示了一个关于使用数组进行 索引而不是在索引变量上循环。 索引表达式。 也可以大量使用布尔索引。如果有条件 需要测试时,此条件也可以写成布尔值 指数例如,而不是

 for i = 1:n-1
   a(i) = b(i+1) - b(i);
 endfor
 for i = 1:n
   if (a(i) > 5)
     a(i) -= 20
   endif
 endfor

它利用了“a>5”生成布尔索引的事实

尽可能使用elementwise向量运算符以避免循环 (运算符,如“*”和“^”)。 算术运算。简单地说 内联函数,“矢量化”函数可以自动执行此操作

--内置功能:矢量化(乐趣) 通过替换 所有出现的“,”/”等,以及“,”/”等

 This may be useful, for example, when using inline functions with
 numerical integration or optimization where a vector-valued
 function is expected.

      fcn = vectorize (inline ("x^2 - 1"))
         => fcn = f(x) = x.^2 - 1
      quadv (fcn, 0, 3)
         => 6

 See also:  inline,  formula,
  argnames.
还可以利用这些元素运营商中的广播 避免循环和不必要的中间内存分配。
 广播

如果可能,请使用内置函数和库函数。内置和 编译函数非常快。即使使用m文件库函数, 很有可能它已经优化了,或者将进一步优化 在未来的版本中

例如,甚至比

 a = b(2:n) - b(1:n-1);

大多数倍频程函数都是用向量和数组参数编写的 介意如果您发现自己用一个非常简单的操作编写循环, 这种功能很可能已经存在。以下 函数经常出现在矢量化代码中:

  • 索引操纵

    * find
    
    * sub2ind
    
    * ind2sub
    
    * sort
    
    * unique
    
    * lookup
    
    * ifelse / merge
    
  • 重复

    * repmat
    
    * repelems
    
  • 矢量化算法

    * sum
    
    * prod
    
    * cumsum
    
    * cumprod
    
    * sumsq
    
    * diff
    
    * dot
    
    * cummax
    
    * cummin
    
  • 高维阵列的形状

    * reshape
    
    * resize
    
    * permute
    
    * squeeze
    
    * deal
    

还可以查看斯坦福ML wiki上的这些页面,以获得更多示例指导


您能提供GLM讲座的链接吗?由Andrew Ng教授在斯坦福大学的ML课程提供:-GLM和Softmax回归材料见讲座1结尾
* reshape

* resize

* permute

* squeeze

* deal