【问题标题】:Matlab/Octave 1-of-K representationMatlab/Octave 1-of-K 表示
【发布时间】:2011-11-08 17:04:45
【问题描述】:

我有一个大小为 5000,1(矩阵)的 y,其中包含 1 到 10 之间的整数。我想将这些索引扩展为 1-of-10 向量。即,y 包含 1,2,3...,我希望它“扩展”为:

1 0 0 0 0 0 0 0 0 0 
0 1 0 0 0 0 0 0 0 0
0 0 1 0 0 0 0 0 0 0 

最好的方法是什么?

我试过了:

Y = zeros(5000,10); Y(y) = 1; 

但它没有用。

它适用于矢量:

如果y = [2 5 7]Y = zeros(1,10),那么Y(y) = [0 1 0 0 1 0 1 0 0 0]

【问题讨论】:

标签: matlab matrix octave


【解决方案1】:

考虑以下几点:

y = randi([1 10],[5 1]);       %# vector of 5 numbers in the range [1,10]
yy = bsxfun(@eq, y, 1:10)';    %# 1-of-10 encoding

例子:

>> y'
ans =
     8     8     4     7     2
>> yy
yy =
     0     0     0     0     0
     0     0     0     0     1
     0     0     0     0     0
     0     0     1     0     0
     0     0     0     0     0
     0     0     0     0     0
     0     0     0     1     0
     1     1     0     0     0
     0     0     0     0     0
     0     0     0     0     0

【讨论】:

  • 这就是我正在寻找的,给予或接受转置 :-) 谢谢!
  • @Frank:我也相信统计工具箱有一个有点相似的功能DUMMYVAR
【解决方案2】:
n=5
Y = ceil(10*rand(n,1))
Yexp = zeros(n,10);
Yexp(sub2ind(size(Yexp),1:n,Y')) = 1

另外,考虑使用稀疏,如:Creating Indicator Matrix

【讨论】:

  • bsxfun v. sub2ind 是否有相对优缺点?
  • @Frank:这是基于索引的,我的涉及进行平等比较......看看它们在性能方面的比较会很有趣
  • 我检查了性能。 sub2ind 解决方案比 bsxfun 解决方案稍快。
【解决方案3】:

虽然稀疏可能更快并节省内存,但涉及 eye() 的答案会更优雅,因为它比循环更快,并且它是在该课程的 octave 讲座中介绍的

这里是 1 到 4 的示例

V = [3;2;1;4];
I = eye(4);
Vk = I(V, :);

【讨论】:

  • 对我有用的是 eye(K)(V,:) ,它与您的相似,但将第 2 行和第 3 行压缩为一行。更有用的是,K 是可能的类数,而不是实际存在的类,因此例如,如果有 10 个可能的结果,其中 4 个实际存在,它会更正确、更可靠地工作。
【解决方案4】:

你可以试试cellfun操作:

function vector = onehot(vector,decimal)
    vector(decimal)=1;
end
aa=zeros(10,2);
dec=[5,6];
%split into columns
C=num2cell(aa,1);
D=num2cell(dec,1);
onehotmat=cellfun("onehot",C,D,"UniformOutput",false);
output=cell2mat(onehotmat);

【讨论】:

    【解决方案5】:

    我想你的意思是:

    y = [2 5 7];
    Y = zeros(5000,10);
    Y(:,y) = 1;
    

    问题编辑后,应该是这样的:

    y = [2,5,7,9,1,4,5,7,8,9....]; //(size (1,5000))
    for i = 1:5000
        Y(i,y(i)) = 1;
    end
    

    【讨论】:

    • 这会将整个 y 列设置为 1。
    • 我想避免编写循环,这是最明显的解决方案:-)
    • 问题不是很清楚,直到 Amro 编辑它:),一定要接受其他人的回答
    • 他的问题实际上是最好的方法是什么,你提出了一个 for 循环 XD。
    猜你喜欢
    • 2011-12-22
    • 2011-12-22
    • 2016-10-13
    • 2013-12-31
    • 1970-01-01
    • 2023-03-25
    • 2013-05-17
    • 2011-11-29
    • 2012-10-31
    相关资源
    最近更新 更多