【问题标题】:Creating summation series functions in Matlab with variables for optimization在 Matlab 中使用变量创建求和序列函数以进行优化
【发布时间】:2018-08-05 01:09:45
【问题描述】:

我有一个包含 1125 行和 64 列的数据集。其中前 554 行属于一个类,其余行属于另一个类。目标函数

将根据 R_1 和 R_2 最小化,其中两者都是行向量(1 x 64)。 x_i 和 x_l 是数据矩阵中的行。我正在尝试使用优化工具箱最小化这个目标函数,但我正在努力以所需的形式获得目标函数并遇到错误。这就是我到目前为止的编码方式

data = xlsread('data.xlsx');
dat1 = data(1:554,:);
dat2 = data(555:1125,:);
f1 = @(x) 0;
f2 = @(x) 0;
%% for digits labeled 0
for i = 1:554
    f1 = @(x) f1 + (dat1(i,:) - x(1)).^2;
end
%% for digits labeled 1
for j = 1:571
    f2 = @(x) f2 + (dat2(j,:) - x(2)).^2;
end
%% final objective function
f = @(x) 1/554*f1 + 1/571*f2;
%%
x = fminunc(f);

请指导我如何在Matlab中正确形成这种类型的目标函数

【问题讨论】:

  • 请不要将代码(文本)作为图像。这似乎很明显。

标签: matlab optimization machine-learning


【解决方案1】:

您的代码没有任何意义。几个问题

  • f1 = @(x) 0;f2 = @(x) 0 定义了总是返回零的匿名函数。这样做的目的是什么?
  • f1,f2,f 的每个进一步定义都试图对匿名函数进行算术运算。目前尚不清楚您希望这样做能实现什么。
  • x = fminunc(f); 缺少一个参数,它也需要一个初始猜测。这不仅是为了初始化算法,也是为了让fminunc 知道f 的输入应该具有的维度。

对于您的情况,应定义f,以便传递给它的一半值引用R1,另一半引用R2。例如定义

l2_sq = @(x) sum(x.^2,2);  % return norm(x,2)^2 for each row of x
f1 = @(R1) sum(l2_sq(bsxfun(@minus, dat1, R1)));
f2 = @(R2) sum(l2_sq(bsxfun(@minus, dat2, R2)));
f3 = @(R1,R2) -10 * norm(R1-R2,1);
f = @(R) f1(R(1:64)) + f2(R(65:128)) + f3(R(1:64), R(65:128));

由于组合的R 向量有 128 个元素,我们需要生成一个包含 128 个元素的初始猜测。在这种情况下,我们可以只使用随机高斯噪声

R0 = randn(1,128);

最后,打电话给fminunc

Rhat = fminunc(f, R0);
R1 = Rhat(1:64);
R2 = Rhat(65:128);

其中R1R2 是最佳值。

注意在 MATLAB 2016b 及更高版本中,隐式扩展允许您将 bsxfun(@minus, dat1, R1) 替换为更高效的 dat1 - R1bsxfun(@minus, dat2, R2) 也是如此。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多