我在matlab中编写梯度下降.对于两个功能,我得到了更新步骤:
Run Code Online (Sandbox Code Playgroud)temp0 = theta(1,1) - (alpha/m)*sum((X*theta-y).*X(:,1)); temp1 = theta(2,1) - (alpha/m)*sum((X*theta-y).*X(:,2)); theta(1,1) = temp0; theta(2,1) = temp1;
但是,我想要对此代码进行矢量化,并能够将其应用于任意数量的功能.对于矢量化部分,有人向我指出,我想要做的是矩阵乘法
Run Code Online (Sandbox Code Playgroud)theta = theta - (alpha/m) * (X' * (X*theta-y));
这很好看,但是当我尝试时,我意识到它不适用于梯度下降,因为参数不会同时更新.
然后,我如何矢量化此代码并确保参数并同时更新?
我在几个地方(在文档和这篇博文中阅读:http://blogs.mathworks.com/loren/2007/05/16/purpose-of-inv/)中读到,在Matlab中使用inv不是建议因为它很慢而且不准确.
我试图找出这种不准确的原因.截至目前,谷歌没有给出有趣的结果,所以我认为有人可以指导我.
谢谢 !
这是我的一个朋友作为他的家庭作业(在算法和数据结构类中)收到的问题.他问我这件事.但是,我无法解决它,并且在过去的几天里一直在思考它.
有Ñ范围随机整数[0,2 31 -1](有可能重复.确定是否3个数字,这些数字的满足甲 + 乙 = Ç.
我首先提出了一个O(n 2 log n)的天真算法.然后我想出了一个O(n 2)的算法.这是伪代码:
sort(a); // non-descending
for (i = 0; i < n; i++) {
j = i; k = i + 1;
while (j < n && k < n) {
if (a[i] + a[j] == a[k])
return true;
else if (a[i] + a[k] < a[j])
k++;
else
j++;
}
}
return false;
Run Code Online (Sandbox Code Playgroud)
然而,问题表明1 < n <= 10 6.我相信O(n …
关于在numpy内部和外部矢量产品,矢量矩阵乘法等方面使用多核(在英特尔硬件上)的最新技术是什么?
numpy如果有必要,我很乐意重建,但此时我正在研究如何在不改变代码的情况下加快速度.
作为参考,我show_config()的如下,我从未观察numpy到使用多个核心:
atlas_threads_info:
libraries = ['lapack', 'ptf77blas', 'ptcblas', 'atlas']
library_dirs = ['/usr/local/atlas-3.9.16/lib']
language = f77
include_dirs = ['/usr/local/atlas-3.9.16/include']
blas_opt_info:
libraries = ['ptf77blas', 'ptcblas', 'atlas']
library_dirs = ['/usr/local/atlas-3.9.16/lib']
define_macros = [('ATLAS_INFO', '"\\"3.9.16\\""')]
language = c
include_dirs = ['/usr/local/atlas-3.9.16/include']
atlas_blas_threads_info:
libraries = ['ptf77blas', 'ptcblas', 'atlas']
library_dirs = ['/usr/local/atlas-3.9.16/lib']
language = c
include_dirs = ['/usr/local/atlas-3.9.16/include']
lapack_opt_info:
libraries = ['lapack', 'ptf77blas', 'ptcblas', 'atlas']
library_dirs = ['/usr/local/atlas-3.9.16/lib']
define_macros = [('ATLAS_INFO', '"\\"3.9.16\\""')]
language = f77
include_dirs = ['/usr/local/atlas-3.9.16/include'] …Run Code Online (Sandbox Code Playgroud) 我有一个numpy 2d阵列[中/大型 - 比如500x500].我想找到它的元素指数的特征值.问题是某些值非常负(-800,-1000等),并且它们的指数下溢(意味着它们非常接近零,因此numpy将它们视为零).无论如何在numpy中使用任意精度?
我梦想的方式:
import numpy as np
np.set_precision('arbitrary') # <--- Missing part
a = np.array([[-800.21,-600.00],[-600.00,-1000.48]])
ex = np.exp(a) ## Currently warns about underflow
eigvals, eigvecs = np.linalg.eig(ex)
Run Code Online (Sandbox Code Playgroud)
我已经搜索了一个gmpy和mpmath的解决方案无济于事.任何想法都会受到欢迎.
说,我有两个CGRects,CGRect A和CGRect B.我的UIView的框架与CGRect B相同,但我想创建一个动画,显示UIView从框架A转换到B.
我试图通过改变UIView的transform属性来做到这一点,所以我不必太乱用它的框架.但是,我需要CGAffineTransform来实现这一目标.计算此变换的最佳方法是什么?
我一直在阅读很多关于这一点,我读的越多,我就越困惑.
我的理解:在行主要行连续存储在内存中,列主要列连续存储在内存中.因此,如果我们有一系列数字[1, ..., 9]并且我们想将它们存储在行主矩阵中,我们得到:
|1, 2, 3|
|4, 5, 6|
|7, 8, 9|
Run Code Online (Sandbox Code Playgroud)
而专栏(如果我错了,纠正我)是:
|1, 4, 7|
|2, 5, 8|
|3, 6, 9|
Run Code Online (Sandbox Code Playgroud)
这实际上是前一个矩阵的转置.
我的困惑:嗯,我没有看到任何区别.如果我们迭代两个矩阵(按第一个中的行和第二个中的列),我们将以相同的顺序覆盖相同的值:1, 2, 3, ..., 9
即使矩阵乘法是相同的,我们采用第一个连续元素并将它们与第二个矩阵列相乘.所以说我们有矩阵M:
|1, 0, 4|
|5, 2, 7|
|6, 0, 0|
Run Code Online (Sandbox Code Playgroud)
如果我们乘上一列,主要基质R用M,那就是R x M我们会得到:
|1*1 + 2*0 + 3*4, 1*5 + 2*2 + 3*7, etc|
|etc.. |
|etc.. |
Run Code Online (Sandbox Code Playgroud)
如果我们乘列矩阵主要C有M,那就是C x M采取的列C,而不是其行,我们得到完全来自相同的结果R …
下面的代码执行操作上gpuArrays相同的操作a和b在两种不同的方式.第一部分计算(a'*(a*b)')',第二部分计算a*b*a.然后验证结果是相同的.
%function test
clear
rng('default');rng(1);
a=sprand(3000,3000,0.1);
b=rand(3000,3000);
a=gpuArray(a);
b=gpuArray(b);
tic;
c1=gather(transpose(transpose(a)*transpose(a*b)));
disp(['time for (a''*(a*b)'')'': ' , num2str(toc),'s'])
clearvars -except c1
rng('default');
rng(1)
a=sprand(3000,3000,0.1);
b=rand(3000,3000);
a=gpuArray(a);
b=gpuArray(b);
tic;
c2=gather(a*b*a);
disp(['time for a*b*a: ' , num2str(toc),'s'])
disp(['error = ',num2str(max(max(abs(c1-c2))))])
%end
Run Code Online (Sandbox Code Playgroud)
但是,计算(a'*(a*b)')'速度大约是计算速度的4倍a*b*a.以下是R2018a上Nvidia K20上面脚本的输出(我尝试过不同的版本和不同的GPU,具有相似的行为).
>> test
time for (a'*(a*b)')': 0.43234s
time for a*b*a: 1.7175s
error = 2.0009e-11
Run Code Online (Sandbox Code Playgroud)
甚至更奇怪的是,如果上述脚本的第一行和最后一行是未注释的(它变成一个函数),则两个取较长的时间量(〜1.7S代替〜0.4秒).以下是此案例的输出:
>> test
time for (a'*(a*b)')': 1.717s
time for a*b*a: 1.7153s
error = 1.0914e-11
Run Code Online (Sandbox Code Playgroud)
我想知道是什么导致了这种行为,以及如何在matlab函数内而不是在脚本内部的较短时间内(即~0.4s而不是~1.7s)执行 …
我在这里关注PyTorch教程.它说
x = torch.randn(3, requires_grad=True)
y = x * 2
while y.data.norm() < 1000:
y = y * 2
print(y)
Out:
tensor([-590.4467, 97.6760, 921.0221])
Run Code Online (Sandbox Code Playgroud)
有人可以解释一下data.norm()在这里做什么吗?当我改变.randn到.ones它的输出 tensor([ 1024., 1024., 1024.]).