使用 * 或者 np.multiply() 可实现对应元素相乘
import numpy as np
a = [2, 2, 2, 2, 5]
b = 2
print(np.multiply(a, b))
print(np.multiply(a, a))
print(np.array(a)*np.array(a))
print(a*a) # 会报错!因为 * 实现对应元素相乘,只适用于 np.array 类型
使用 np.multiply() 可实现对应矩阵对应元素相乘
import numpy as np
b = [[1, 2, 3, 4, 5],
[3, 2, 1, 0, 5]]
c = [[1, 1, 1, 1, 2],
[2, 2, 2, 2, 0]]
print(np.multiply(b, c))
print(np.array(b)*np.array(c))
使用 .dot 实现矩阵乘法!(要注意行数和列数之间的的对应!)
import numpy as np
b = [[1, 2, 3],
[3, 2, 1]] # 2*3
c = [[1, 1],
[2, 2],
[3, 3]] # 3*2
print(np.dot(b, c))
(参考:Python中乘法)
(参考:Python 实现两个列表里元素对应相乘的方法)
(参考:Python中的几种矩阵乘法(转))
根据多元高斯模型的概率公式计算概率密度时,涉及到矩阵的点乘,在 Python 中我使用了 *。明显地,矩阵的行数/列数没有对应上,但Python 没有报错。
经排查,是因为计算的是元素乘法而不是矩阵点乘。改成 np.dot() 之后,计算正确!
# 计算每个样本的多元高斯分布的 pdf
N = dataset.values.shape[1]
a = (2 * math.pi) ** (N / 2)
b = (np.linalg.det(Sigma)) ** (1/2)
c = np.linalg.inv(Sigma)
tmp = dataset.values
pdf = []
for x in tmp:
aa = 1 / (a * b)
bb = np.dot(x - mu, c) # 这才是矩阵点乘!!!
cc = np.dot(bb, (x - mu).T) # 这才是矩阵点乘!!!
dd = aa * math.exp(-1/2 * cc)
# bb = -1 / 2 * (x - mu) * c * (x - mu).T # 这不是矩阵乘法!!!
pdf.append(dd)