% 假设的联合概率分布矩阵 P(X,Y)
P_XY = [0.25, 0, 0, 0;
0.1, 0.3, 0,0;
0, 0.05, 0.1, 0;
0,0,0.05,0.1;
0,0,0.05,0];
% 计算边缘概率分布 P(X) 和 P(Y)
PX = sum(P_XY, 2); % 对P_XY的每一行求和得到P(X)
PY = sum(P_XY, 1); % 对P_XY的每一列求和得到P(Y),但我们需要转置结果以匹配PX的维度
PY = PY'; % 转置PY以匹配PX的维度
% 计算熵 H(X) 和 H(Y)
H_X = -sum(PX .* log2(PX + eps)); % 使用eps避免对0取对数
H_Y = -sum(PY .* log2(PY + eps));
% 计算联合熵 H(XY)
H_XY = -sum(sum(P_XY .* log2(P_XY + eps)));
% 计算条件熵 H(Y|X)
H_Y_given_X = zeros(size(PX, 1), 1);
for i = 1:size(PX, 1)
if PX(i) > 0
H_Y_given_X(i) = -sum(P_XY(i,:) ./ PX(i) .* log2(P_XY(i,:) ./ PX(i) + eps));
else
% 如果PX(i)为0,则条件熵在该点未定义(或可以视为0,取决于上下文)
% 这里我们简单地将其设为0
H_Y_given_X(i) = 0;
end
end
H_Y_given_X_avg = sum(PX .* H_Y_given_X); % 对H_Y_given_X加权平均得到H(Y|X)
% 计算条件熵 H(X|Y)
H_X_given_Y = zeros(size(PY, 1), 1);
for i = 1:size(PY, 1)
if PY(i) > 0
H_X_given_Y(i) = -sum(P_XY(:,i) ./ PY(i) .* log2(P_XY(:,i) ./ PY(i) + eps));
else
H_X_given_Y(i) = 0; % PY(i)为0时条件熵未定义,这里设为0
end
end
H_X_given_Y_avg = sum(PY .* H_X_given_Y);
% 显示结果
disp('H(X) =');
disp(H_X);
disp('H(Y) =');
disp(H_Y);
disp('H(XY) =');
disp(H_XY);
disp('H(Y|X) =');
disp(H_Y_given_X_avg);
disp('H(X|Y) =');
disp(H_X_given_Y_avg);