【问题标题】:Estimate Naive - Bayes probability function估计朴素 - 贝叶斯概率函数
【发布时间】:2017-04-21 14:45:46
【问题描述】:

我一直在将 Matlab 转换为 Python 时遇到问题。我在去年编写的 Matlab 中有代码(正在工作),现在尝试将这些函数转换为 Python。其中 5 个有效,4 个无效。我真的被困住了,希望得到一些帮助。 这是关于估计朴素贝叶斯概率的。这是 Matlab 中的函数:

function [ p_x_y ] = estimate_p_x_y_NB(Xtrain,ytrain,a,b )

% Function calculates probability distribution p(x|y), assuming that x is binary
% and its elements are independent from each other

% Xtrain - training dataset NxD
% ytrain - training dataset class labels 1xN
% p_x_y - binomial distribution estimators - element at position(m,d)
% represents estimator p(x_d=1|y=m) MxD
% N - number of elements in training dataset
D = size(Xtrain,2);
M = length(unique(ytrain));
p_x_y = zeros(M,D);
for i=1:M
    for j=1:D
        numerator = sum((ytrain==i).*((Xtrain(:,j)==1))')+a-1;
        denominator = sum(ytrain==i)+a+b-2;
        p_x_y(i,j) = numerator/denominator;
    end
end
end

这是我对 Python 的翻译:

def estimate_p_x_y_nb(Xtrain, ytrain, a, b):
    """
    :param Xtrain: training data NxD
    :param ytrain: class labels for training data 1xN
    :param a: parameter a of Beta distribution
    :param b: parameter b of Beta distribution
    :return: Function calculated probality p(x|y) assuming that x takes binary values and elements
    x are independent from each other. Function returns matrix p_x_y that has size MxD.
    """
    D = Xtrain.shape[1]
    M = len(np.unique(ytrain))
    p_x_y = np.zeros((M, D))
    for i in range (M):
        for j in range(D):
            up = np.sum((ytrain == i+1).dot((Xtrain[:, j]==1)).conjugate().T) + a - 1
            down = np.sum((ytrain == i+1) + a + b -2)
            p_x_y[i,j] = up/down
    return p_x_y

追溯:

    p_x_y[i,j] = up/down
ValueError: setting an array element with a sequence.

如果您发现该功能有任何问题,我会非常乐意指出。另外,我在up 变量中使用了.dot 而不仅仅是*,因为当它是* 时,我收到了一个关于尺寸不准确的错误,但有了这个,它似乎可以正常工作。谢谢。

【问题讨论】:

  • 您是否尝试过将 MATLAB 代码的结果与 Python 在每一行中获得的结果进行比较,看看问题出在哪里?这是缩小问题范围的简单方法。或提供Minimal, Complete, and Verifiable Example
  • 用点产品dot 替换元素产品.* 可能是错误的。 numpy 中的元素乘积是*
  • @kazemakase 好吧,所以你说它应该保留 * ? (在python中?)。然而,当我这样离开时,我得到一个“ValueError:尺寸不匹配”。我想这是因为后来的转置,但它在 Matlab 中工作:(
  • 是的。使用* 并找出错误的原因,而不是使用dot 使症状消失 :) 我不知道是什么导致了错误——这取决于数组的形状。很可能是由于 Matlab 和 Python 中的广播规则不同。将表达式拆开,找出导致错误的确切原因。

标签: python matlab numpy


【解决方案1】:

我认为您分配分母的语句存在问题。你用错了括号

down = np.sum((ytrain == i+1) + a + b -2)

应该是

down = np.sum((ytrain == i+1)) + a + b -2

另外,尝试改变

up = np.sum((ytrain == i+1).dot((Xtrain[:, j]==1)).conjugate().T) + a - 1

up = np.sum((ytrain == i+1) * (Xtrain[:, j]==1)) + a - 1

我希望这有效。我没有看到您的代码有任何其他问题。

更改后,我使用了值

Xtrain = np.array([[1,2,3,4,5], [1,2,3,4,5]])
ytrain = np.array([1,2])
a = 1
b = 1

这给出了输出

array([[ 1.,  0.,  0.,  0.,  0.],
       [ 1.,  0.,  0.,  0.,  0.]])

在 MATLAB 和 python 中。如果结果符合预期,您可以使用这些值进行检查。

【讨论】:

  • 谢谢,没注意到!更改了它,但不幸的是,我的程序在 up/down 时仍然出错
  • 我同意这个 ammportal,当我将 python 代码更改为 down = np.sum((ytrain == i+1)) + a + b -2 时,我在 python 中得到了与在 matlab 中相同的答案。
  • @Lin K 对我来说,在此更改之后没有错误。您确定您的代码是正确的并且没有其他干扰它吗?我已经编辑了我的答案以显示我得到的输出。
  • 我检查了很多次代码,我已经记住了,我不知道为什么它不起作用:(我只需要实现功能,它们必须得到程序的“批准”所以我无法输入我自己的值。但是一切看起来也很正常,无论我离开 .dot 还是将其更改为 *,我仍然得到一个错误。这让我很生气。非常感谢你!跨度>
  • 我认为您的代码中可能还有另一个错误。我对答案做了另一个更改。
猜你喜欢
  • 2014-01-13
  • 2013-11-13
  • 2013-08-06
  • 2021-03-05
  • 2015-10-09
  • 2013-07-18
  • 2018-08-05
  • 2016-10-05
  • 2023-03-08
相关资源
最近更新 更多