python - ValueError:形状(5,5)和(20,)未对齐:5(dim 1)!= 20(dim 0)
问题描述
我正在计算 LDA 的特征值和特征向量。在获得内部散点矩阵值 (SW) 后,我反转我的矩阵,以便我可以将其乘以类之间的散点值或 Sb,但是当我尝试通过将其乘以 Sb 来计算逆 Sw 值时,我得到标题中描述的错误。
这是我的实际 InvSw 值:
[[ 1.04681227e-02,
-8.88438953e-03,
-1.49760770e-03,
-1.40836916e-04,
5.62586740e-04],
[-8.88438953e-03,
2.51997617e-02,
-1.29503509e-02,
-1.58583123e-03,
-1.93338715e-03],
[-1.49760770e-03,
-1.29503509e-02,
1.96652733e-01,
-1.26808048e-01,
-5.57741506e-02],
[-1.40836916e-04,
-1.58583123e-03,
-1.26808048e-01,
2.72992280e-01,
-1.45652927e-01],
[ 5.62586740e-04,
-1.93338715e-03,
-5.57741506e-02,
-1.45652927e-01,
2.04121963e-01]]
我的 Sb 值:
[1.29960e+02, 4.09600e+01, 4.00000e-02, 9.24160e+02, 1.00000e+00, 5.10760e+02,
7.95240e+02, 8.50084e+03, 7.84000e+00, 5.21284e+03, 1.96000e+02, 1.63840e+02,
3.38560e+02, 1.96000e+00, 3.68640e+02, 3.60000e-01, 4.00000e-02, 2.50000e+01,
3.38560e+02, 3.53440e+02]
我如何尝试乘法:
invSw_by_Sb = np.dot(invSw, Sb)
整个代码:
c_A_array = [[ 31, 25, 17, 62, 26, 23, 193, 143, 37, 29, 220, 216, 175, 195, 207, 198, 190, 222, 178, 214],
[ 31, 26, 19, 59, 25, 23, 193, 140, 37, 29, 220, 216, 174, 195, 207, 198, 190, 220, 178, 214],
[ 31, 23, 17, 67, 23, 22, 195, 147, 38, 31, 222, 215, 182, 195, 213, 198, 185, 221, 178, 207],
[ 31, 23, 19, 67, 23, 23, 194, 144, 37, 31, 222, 218, 179, 198, 216, 198, 186, 221, 179, 207],
[ 31, 28, 17, 65, 23, 22, 193, 142, 36, 31, 222, 217, 177, 195, 216, 196, 182, 220, 174, 207]]
c_B_array = [[ 16, 24, 33, 43, 43, 58, 163, 76, 57, 105, 205, 200, 193, 188, 186, 193, 182, 227, 193, 227],
[ 9, 13, 22, 36, 13, 49, 163, 39, 33, 105, 204, 200, 193, 191, 188, 193, 183, 224, 194, 227],
[ 23, 17, 10, 28, 21, 40, 166, 46, 28, 102, 208, 206, 196, 198, 195, 202, 190, 225, 196, 229],
[ 25, 19, 11, 30, 23, 39, 166, 46, 26, 99, 208, 206, 199, 196, 198, 201, 189, 227, 198, 231],
[ 25, 20, 12, 31, 25, 40, 169, 48, 27, 101, 211, 206, 198, 198, 196, 202, 190, 226, 198, 229]]
c_A_array = np.asarray(c_A_array)
c_B_array = np.asarray(c_B_array)
c_1_mean = c_A_array.mean(axis=0)
c_2_mean = c_B_array.mean(axis=0)
S1_c1 = np.cov(c_A_array)
S2_c2 = np.cov(c_B_array)
Sw = S1_c1 + S2_c2
Sb = (c_1_mean - c_2_mean) * (c_1_mean - c_2_mean)
invSw = np.linalg.inv(Sw)
invSw_by_Sb = np.dot(invSw, Sb)
[V, D] = np.linalg.eig(invSw_by_Sb)
解决方案
您正在为 np.cov 和 np.mean 使用不同的维度。如果您想使用 np.mean(..., axis=0),那么您还应该更改 cov 的维度,如下所示:
c_1_mean = c_A_array.mean(axis=0)
c_2_mean = c_B_array.mean(axis=0)
S1_c1 = np.cov(c_A_array.T)
S2_c2 = np.cov(c_B_array.T)
Sw = S1_c1 + S2_c2
此外,您的 Sb 应该是协方差矩阵:
Sb = (c_1_mean - c_2_mean) * (c_1_mean - c_2_mean).reshape([-1, 1])
推荐阅读
- redis - 如何监控 Redis 主题?
- sql - 使用 SQL 删除
- wordpress - 在 Wordpress Gravity Form 插件中,如何自定义文件上传 UI?
- python - 枕头不能用填充画文字
- spring-boot - Thymeleaf doesn't work in spring boot and also doesn't show in console
- javascript - 如何使反应停止点击重复元素
- javascript - 如何使用javascript添加基于按钮单击的重复元素?
- css - 如何在标题中正确定位这个 CSS 伪元素?
- sql - 如何使用sql根据一列逐行查找平均值
- indexing - Excel - 使用新数据列表更新数据表