向量化scipy规范.pdf

时间:2019-01-27 05:12:55

标签: python numpy scipy

def predictDigit(img):

    prob = [0] * 10

    for digit in range(10):
        for pix in range(len(img)):
            std = pix_std[digit][pix]
            mean = pix_means[digit][pix]
            if std == 0:
                continue
            else:
                prob[digit] += np.log(norm.pdf(img[pix], mean, std))
        prob[digit] += np.log(digit_prob[digit])

    return np.argmax(prob)

我编写了此函数,以将其用于实现朴素贝叶斯分类器以进行数字分类。想法是遍历输入图像的所有像素,并将np.log(norm.pdf(img[pix], mean, std))添加到prob并在末尾返回其argmax,以标记输入图像的数字。

但是,这花费了太长时间。我成功地向量化使用以下方法获取均值和标准差:

pix_means[digit] = np.mean(image_cluster[digit], axis = 0) pix_std[digit] = np.std(image_cluster[digit], axis = 0)

但是,我不确定norm.pdf是否可以进行矢量化。

请帮助。

编辑

数字概率

digit_count = {}

for digit in y_train:
    if digit not in digit_count:
        digit_count[digit] = 1
    else:
        digit_count[digit] += 1

digit_prob = {}

for digit in range(10):
    digit_prob[digit] = digit_count[digit] / len(y_train)

image_cluster

image_cluster = {}

for image, digit in zip(x_train, y_train):
    if digit not in image_cluster:
        image_cluster[digit] = [image]
    else:
        image_cluster[digit].append(image)

pix_means = {}
pix_std = {}

# get mean and sd
for digit in range(10):
    pix_means[digit] = np.mean(image_cluster[digit], axis = 0)
    pix_std[digit] = np.std(image_cluster[digit], axis = 0)

1 个答案:

答案 0 :(得分:0)

norm.pdf可以立即矢量化!

要计算CDF的多个点,我们可以传递一个列表或一个numpy数组。

   norm.cdf([-1., 0, 1])
   array([ 0.15865525,  0.5,  0.84134475])
   import numpy as np
   norm.cdf(np.array([-1., 0, 1]))
   array([ 0.15865525,  0.5,  0.84134475])

因此,对pdf,cdf等基本方法进行了矢量化处理。

https://docs.scipy.org/doc/scipy/reference/tutorial/stats.html