【问题标题】:Matlab Conditional probability from dataset来自数据集的 Matlab 条件概率
【发布时间】:2014-11-23 01:29:06
【问题描述】:

我有一个 500x5 的矩阵 M,我需要计算条件概率。我已经离散化了我的数据,然后我有了这个代码,它目前只适用于3 变量而不是5,但现在这很好。

下面的代码已经算出了我得到A=1B=1C=1的次数,我们得到A=2B=1C=1等的次数。

data = M;

npatients=size(data,1)

asum=zeros(4,2,2)
prob=zeros(4,2,2)
for patient=1:npatients,
h=data(patient,1)
i=data(patient,2)
j=data(patient,3)
asum(h,i,j)=asum(h,i,j)+1
end
for h=1:4,
for i=1:2,
for j=1:2,
prob(h,i,j)=asum(h,i,j)/npatients
end
end
end

所以我需要代码求和以得到我们得到A=1B=1(加在所有C 上)的次数:

Prob(C=1 given A=1 and B=1) = P(A=1,B=1, C=1)/P( A=1, B=1). 

这是第一条规则的规则强度。我需要了解如何循环 ABC 以获取其余部分以及如何在 Matlab 中实际使用它。我不知道它是否有用,但我有代码可以将每一列放入自己的东西中。:

dest = M(:,1); gen = M(:,2); age = M(:,3); year = M(:,4); dur = M(:,5);

所以说dest 是结果,genage 是前因我该怎么做。

以下以第一批10患者的数据为例:

destination gender  age
       2    2   2
       2    2   2
       2    2   2
       2    2   2
       2    2   2
       2    1   1
       3    2   2
       2    2   2
       3    2   1
       3    2   1

任何帮助表示赞赏和急需。

【问题讨论】:

  • 对于asum(h,i,j)=asum(h,i,j)+1j91 对于第一位患者
  • 您好,感谢您的回复。你能详细说明一下吗?我已经在代码中有 asum(h,i,j)=asum(h,i,j)+1 (在 j=data(patient,3) 之后),但不是 for 循环,我该怎么办?

标签: matlab dataset probability


【解决方案1】:

您的代码无法通过复制和粘贴来运行,我稍作更改,

最好定义一个函数来计算给定数据的概率,

function p = prob(data)
n = size(data,1);
uniquedata = unique(data);
p = zeros(length(uniquedata),2);
p(:,2) = uniquedata;
for i = 1 : size(uniquedata,1)
    p(i,1) = sum(data == uniquedata(i)) / n;
end
end

现在在另一个脚本中,

data =[3    2   91;
       3    2   86;
       3    2   90;
       3    2   85;
       3    2   86;
       3    1   77;
       4    2   88;
       3    2   90;
       4    2   79;
       4    2   77;
       4    1   65;
       3    1   60];
pdest = prob(data(:,1));
pgend = prob(data(:,2));
page = prob(data(:,3));

这会给,

page =

0.0833   60.0000
0.0833   65.0000
0.1667   77.0000
0.0833   79.0000
0.0833   85.0000
0.1667   86.0000
0.0833   88.0000
0.1667   90.0000
0.0833   91.0000

pgend =

0.2500    1.0000
0.7500    2.0000

pdest =

0.6667    3.0000
0.3333    4.0000

这将给出您已经计算出的概率,

注意prob 的第二列是值,第一列是概率。

当您想计算des = 3 & gend = 2 的概率时,您应该创建一个新数据集并调用prob,以供新数据集使用,

mapd2g3 = data(:,1) == 3 & data(:,2) == 2;
datad2g3 = data(mapd2g3,:)

 3     2    91
 3     2    86
 3     2    90
 3     2    85
 3     2    86
 3     2    90

paged2g3 = prob(datad2g3(:,3))

0.1667   85.0000
0.3333   86.0000
0.3333   90.0000
0.1667   91.0000

这是prob(age|dest = 3 & gend = 2)

您甚至可以编写一个函数来创建数据集。

【讨论】:

  • 无法复制粘贴的原因是它不是完整的代码,对此感到抱歉。我也忘了说程序将年龄离散化为 1 或 2,其中 1 = 80
  • @adammcbrinn,看看概率是否正确。
  • 谢谢你这真的很有用,但我不知道如何使用功能。我是否创建一个名为 prob 的文件并将第一位放入其中然后调用它,如果是,我该如何调用它?
  • @adammcbrinn,是的,将第一个脚本复制到一个新的 m 文件中,并将其保存为名称 prob。并在您的主脚本中像我一样将其称为pdest = prob(data(:,1));。您必须将正确的数据列作为输入提供给prob。它将像 matlab 自己的功能之一。我注意到你昨天发布了同样的问题,但它非常混乱!现在好多了。
  • 是的,它有效:D 我看着它,认为它看起来不正确,然后记得数据是离散化的哈哈。非常感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多