redim = 2;
# Loading data
iris_data = readdlm("iris_data.csv");
iris_target = readdlm("iris_target.csv");
# Center data
iris_data = broadcast(-, iris_data, mean(iris_data, 1));
n_data, n_dim = size(iris_data);
Sw = zeros(n_dim, n_dim);
Sb = zeros(n_dim, n_dim);
C = cov(iris_data);
classes = unique(iris_target);
for i=1:length(classes)
index = find(x -> x==classes[i], iris_target);
d = iris_data[index,:];
classcov = cov(d);
Sw += length(index) / n_data .* classcov;
end
Sb = C - Sw;
evals, evecs = eig(Sw, Sb);
w = evecs[:,1:redim];
new_data = iris_data * w;
Run Code Online (Sandbox Code Playgroud)
此代码仅对iris_data执行LDA(线性判别分析).将iris_data的尺寸减小到2.大约需要4秒,但Python(numpy/scipy)只需要大约0.6秒.为什么?
Sal*_*apa 12
这是Julia手册中第一页,第二段的介绍:
由于Julia的编译器与用于Python或R等语言的解释器不同,您可能会发现Julia的性能起初并不直观.如果您发现某些内容很慢,我们强烈建议您在尝试其他任何内容之前先阅读"效果提示"部分.一旦了解了Julia的工作原理,编写几乎与C一样快的代码就很容易了.
摘抄:
避免全局变量
全局变量可能具有其值,因此其类型随时都会发生变化.这使编译器难以使用全局变量优化代码.变量应该是本地的,或者尽可能作为参数传递给函数.
任何性能关键或基准测试的代码都应该在函数内部.
我们发现全局名称通常是常量,并且将它们声明为大大提高了性能
知道脚本(所有程序顶级代码)风格在许多科学计算用户中如此普遍,我建议你至少将整个文件包装在一个let表达式中作为初学者(让我们介绍一个新的本地范围),即:
let
redim = 2
# Loading data
iris_data = readdlm("iris_data.csv")
iris_target = readdlm("iris_target.csv")
# Center data
iris_data = broadcast(-, iris_data, mean(iris_data, 1))
n_data, n_dim = size(iris_data)
Sw = zeros(n_dim, n_dim)
Sb = zeros(n_dim, n_dim)
C = cov(iris_data)
classes = unique(iris_target)
for i=1:length(classes)
index = find(x -> x==classes[i], iris_target)
d = iris_data[index,:]
classcov = cov(d)
Sw += length(index) / n_data .* classcov
end
Sb = C - Sw
evals, evecs = eig(Sw, Sb)
w = evecs[:,1:redim]
new_data = iris_data * w
end
Run Code Online (Sandbox Code Playgroud)
但是我也会敦促你将它重构为小函数,然后组成一个main调用其余函数的函数,就像这样,注意这个重构如何使你的代码变得通用和可重用(和快速):
module LinearDiscriminantAnalysis
export load_data, center_data
"Returns data and target Matrices."
load_data(data_path, target_path) = (readdlm(data_path), readdlm(target_path))
function center_data(data, target)
data = broadcast(-, data, mean(data, 1))
n_data, n_dim = size(data)
Sw = zeros(n_dim, n_dim)
Sb = zeros(n_dim, n_dim)
C = cov(data)
classes = unique(target)
for i=1:length(classes)
index = find(x -> x==classes[i], target)
d = data[index,:]
classcov = cov(d)
Sw += length(index) / n_data .* classcov
end
Sb = C - Sw
evals, evecs = eig(Sw, Sb)
redim = 2
w = evecs[:,1:redim]
return data * w
end
end
Run Code Online (Sandbox Code Playgroud)
using LinearDiscriminantAnalysis
function main()
iris_data, iris_target = load_data("iris_data.csv", "iris_target.csv")
result = center_data(iris_data, iris_target)
@show result
end
main()
Run Code Online (Sandbox Code Playgroud)
笔记:
main 只是一个名字,它可能是你喜欢的任何其他东西.| 归档时间: |
|
| 查看次数: |
981 次 |
| 最近记录: |