首页 > 解决方案 > 矢量化 scipy norm.pdf

问题描述

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)

标签: pythonnumpyscipy

解决方案


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


推荐阅读