MatLab中概率分布向量向量的高效二进制采样

时间:2016-10-03 16:27:31

标签: matlab performance processing-efficiency probability-distribution

我正在整理一些数字分类代码。所以我输入一个数字的图像,说“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中几乎总有不止一种方法来修饰猫),而且这可能构成一个有价值的片段。某人。

2 个答案:

答案 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可能会在每次迭代时重新分配内存(实际上它总是使用相同的参数维度调用)。