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)
答案 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