我正在整理一些数字分类代码。所以我输入一个数字的图像,说“7”,我得出10个概率(即总和为1)。如果我的算法运行良好,第7个元素应该具有最高值。
另外一个复杂因素是我正在处理100个元素的批处理。所以我实际上有一个COLxROW = 100x10 MATRIX,其中每个ROW总和为1。
现在我希望从这100个分布中的每个分布中进行采样,即我需要根据我的概率为每个批处理项生成一个像[0 0 0 1 0 0 0 0 0 0](这将是3)的向量分布。
现有的实施是:
samp = pd*0;
layers = cumsum( pd, 2 );
randoms = rand( batchSize, 1 );
for k = 1:batchSize
index = find( randoms(k) <= layers(k,:), 1 );
samp( k, index ) = 1;
end
但是我宁愿避免显式循环(因为我读过它通常会导致性能不佳)。
效率是关键,因为这个例程在最严格的循环中执行。
如何有效地完成这项工作?
编辑我将尝试回答我的问题,我发帖以防有人可以改进答案(在MatLab中几乎总有不止一种方法来修饰猫),而且这可能构成一个有价值的片段。某人。
答案 0 :(得分:1)
这是一种避免循环的方法:
public class DataContext : DbContext
{
public DataContext : base("DefaultConnection")
{
}
public DbSet<Product> Products { get; set; }
}
[Table("Product")]
public class Product
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int ProductId { get; set; }
public String SessionNo { get; set; }
public String ProductName { get; set; }
public DateTime Date { get; set; }
public String LotNumber { get; set; }
public String RegNumber { get; set; }
public decimal? InitPrice { get; set; }
public decimal? FinalPrice { get; set; }
public String TaxNote { get; set; }
}
public class FileModel
{
public String FileName { get; set; } // Excel file name
public String SheetName { get; set; } // source worksheet name
public String TableName { get; set; } // target table name
public HttpPostedFileBase FileToUpload { get; set; } // uploaded Excel file (version 2007 or above)
}
答案 1 :(得分:0)
以下似乎有效:
function sample = sampleFromPDs( pd )
[batchSize_, nOutputs] = size( pd );
bools = cumsum(pd,2) > repmat( rand(batchSize_,1), 1, nOutputs );
% e.g. 001 111 gives (6+1) - 4 = 3
indexOfFirstONE = (nOutputs+1) - sum(bools, 2);
sample = 0 .* pd;
sample( ...
sub2ind( size(pd), 1:batchSize_, indexOfFirstONE' ) ...
) = 1;
end
但是,我有点担心MatLab可能会在每次迭代时重新分配内存(实际上它总是使用相同的参数维度调用)。