Math 如何矢量化方程?
在看了Andrew Ng教授关于GLM的讲座后,我试图实现Softmax回归算法来解决K分类器问题。我以为我理解了他所说的一切,直到最后编写代码来实现Softmax回归的成本函数,如下所示: 我遇到的问题是试图找出一种将其矢量化的方法。我又一次认为我理解了如何像这样对方程进行向量化,因为我能够对线性回归和逻辑回归进行向量化,但是在看了这个公式之后,我被卡住了 虽然我很想找到一个向量化的解决方案(我意识到已经发布了一个类似的问题:),但我更感兴趣的是你们中是否有人能告诉我一种方法(你们的方法)来有系统地将这样的方程转换成向量化的形式。例如,对于那些ML方面的专家或经验丰富的老手,当您第一次阅读文献中的新算法时,看到它们以类似于上面等式的符号书写,您如何将它们转换为矢量化形式 我意识到我可能会像一个学生问莫扎特,“你怎么弹得这么好?”但我的问题仅仅是出于想更好地掌握这种材料的愿望,并假设不是每个人生来就知道如何矢量化方程,所以一定有人设计了自己的系统,如果是,请分享!非常感谢Math 如何矢量化方程?,math,machine-learning,regression,glm,Math,Machine Learning,Regression,Glm,在看了Andrew Ng教授关于GLM的讲座后,我试图实现Softmax回归算法来解决K分类器问题。我以为我理解了他所说的一切,直到最后编写代码来实现Softmax回归的成本函数,如下所示: 我遇到的问题是试图找出一种将其矢量化的方法。我又一次认为我理解了如何像这样对方程进行向量化,因为我能够对线性回归和逻辑回归进行向量化,但是在看了这个公式之后,我被卡住了 虽然我很想找到一个向量化的解决方案(我意识到已经发布了一个类似的问题:),但我更感兴趣的是你们中是否有人能告诉我一种方法(你们的方法)来
干杯这一个看起来很难矢量化,因为你在求和中做指数运算。我想你是在把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