Matlab N维直方图计数
我目前正试图编写一个函数,使用直方图计数为向量集合分配概率。这基本上是一个计数练习,但需要一些技巧才能有效地实现。我会举例说明: 假设我有一个矩阵Matlab N维直方图计数,matlab,Matlab,我目前正试图编写一个函数,使用直方图计数为向量集合分配概率。这基本上是一个计数练习,但需要一些技巧才能有效地实现。我会举例说明: 假设我有一个矩阵X=[x1,x2…xM],有N行和M列。这里,X表示M,N维向量的集合。换句话说,X的每一列都是N维向量 例如,我们可以使用以下方法为M=10000向量和N=5维度生成这样的X: X = randint(5,10000) 这将生成一个由0和1组成的5 x 10000矩阵,其中每列表示一个由1和0组成的5维向量 我想通过一个基本的直方图计数为每个向量分
X=[x1,x2…xM]
,有N
行和M
列。这里,X
表示M
,N
维向量的集合。换句话说,X
的每一列都是N
维向量
例如,我们可以使用以下方法为M=10000
向量和N=5
维度生成这样的X
:
X = randint(5,10000)
这将生成一个由0和1组成的5 x 10000矩阵,其中每列表示一个由1和0组成的5维向量
我想通过一个基本的直方图计数为每个向量分配一个概率。步骤很简单:首先找到X
的唯一列;其次,计算每个唯一列出现的次数。特定事件发生的概率是该列在X中的#次/在X
中的总列数
回到上面的例子,我可以使用MATLAB中的unique
函数执行第一步,如下所示:
UniqueXs = unique(X','rows')'
上面的代码将返回UniqueXs
,这是一个包含N
行的矩阵,其中只包含唯一的X列。请注意,转置是由于奇怪的MATLAB输入要求造成的
然而,我无法找到一个好方法来计算UniqueX中每个列在X中的次数。所以我想知道是否有人有任何建议
概括地说,我可以想出两种实现计数步骤的方法。第一种方法是使用find
功能,尽管我认为这可能会很慢,因为find
是一种元素操作。第二种方法是递归调用unique
,因为它还可以提供X
中唯一列的one索引。这将允许我们从X
中删除该列,并在结果X
上重新执行unique
,并继续计数
理想情况下,我认为
unique
可能已经在进行一些计数,因此最有效的方法可能是在没有内置函数的情况下工作。这里有两个解决方案,一个假设所有值都是0或1(就像您描述中的示例),另一个则不是。即使是在大数据上,这两种代码都应该非常快(二进制值的代码更是如此)
1) 只有零和一
2) 任意正整数
现在我们可以看到,例如,每个“唯一向量”发生了多少次:
>> table = sortrows([GN num2cell(count)])
table =
'000064850843749' [1] # original vector is: [0 64 850 843 749]
'000130170550598' [1] # and so on..
'000181606710020' [1]
'000220492735249' [1]
'000275871573376' [1]
'000525617682120' [1]
'000572482660558' [1]
'000601910301952' [1]
...
请注意,在我的随机数据示例中,向量空间变得非常稀疏(随着最大可能值的增加),因此,如果所有计数都等于1,我不会感到惊讶…这里有两个解决方案,一个假设所有值都是0或1(就像您描述中的示例),另一个则不是。即使是在大数据上,这两种代码都应该非常快(二进制值的代码更是如此) 1) 只有零和一 2) 任意正整数 现在我们可以看到,例如,每个“唯一向量”发生了多少次:
>> table = sortrows([GN num2cell(count)])
table =
'000064850843749' [1] # original vector is: [0 64 850 843 749]
'000130170550598' [1] # and so on..
'000181606710020' [1]
'000220492735249' [1]
'000275871573376' [1]
'000525617682120' [1]
'000572482660558' [1]
'000601910301952' [1]
...
请注意,在我的随机数据示例中,向量空间变得非常稀疏(随着最大可能值的增加),因此,如果所有计数都等于1,我不会感到惊讶…N会有多大?如果很小,您可能希望将列向量视为二进制字符串。因此,它们可以用整数表示。Thanks@BerkU.:我想到了一个有效的解决方案(通过将列转换为字符串),但只有当值都是0和1时,它才会起作用。总是这样吗?@eat:不知怎的,我没看到你的评论!看起来你已经提出了我的想法…@Amro:是的,但是让我们等一下OP能对这个案子有什么更多的评论。Thanks@Amro不幸的是,情况并非总是如此。在更一般的设置中,每行中的条目可以具有有限的值集(即,第一行中的条目可以是{1,2,3},第二行中的条目可以是{4,5,6})。这有帮助吗?有多大?如果很小,您可能希望将列向量视为二进制字符串。因此,它们可以用整数表示。Thanks@BerkU.:我想到了一个有效的解决方案(通过将列转换为字符串),但只有当值都是0和1时,它才会起作用。总是这样吗?@eat:不知怎的,我没看到你的评论!看起来你已经提出了我的想法…@Amro:是的,但是让我们等一下OP能对这个案子有什么更多的评论。Thanks@Amro不幸的是,情况并非总是如此。在更一般的设置中,每行中的条目可以具有有限的值集(即,第一行中的条目可以是{1,2,3},第二行中的条目可以是{4,5,6})。这有用吗?
>> table = sortrows([GN num2cell(count)])
table =
'000064850843749' [1] # original vector is: [0 64 850 843 749]
'000130170550598' [1] # and so on..
'000181606710020' [1]
'000220492735249' [1]
'000275871573376' [1]
'000525617682120' [1]
'000572482660558' [1]
'000601910301952' [1]
...