SVC使用预计算Laplace核绘制决策边界维度不匹配报错如何解决
问题解决方法
错误原因
报错出现在测试核矩阵计算环节:meshgrid生成的xx、yy是二维网格结构,直接传入laplacian_kernel时,函数会把整个二维数组的行当做样本、列当做特征,和训练集X的2个特征维度不匹配,触发维度错误。
修复方案
先将网格点展平为和训练集特征维度一致的样本数组,再计算测试核矩阵,修改对应两处代码即可:
- 计算测试核矩阵前,先将
xx、yy展平拼接为(样本数, 2)的特征矩阵 - 移除
predict调用中多余的np.c_拼接操作
修正后完整可运行代码
import numpy as np import matplotlib.pyplot as plt from sklearn.datasets import load_iris from sklearn.svm import SVC from sklearn.metrics.pairwise import laplacian_kernel iris_data = load_iris() X = iris_data.data[:, :2] y = iris_data.target h = 0.02 X = np.array(X) y = np.array(y) K = np.array(laplacian_kernel(X, gamma=.5)) svm = SVC(kernel='precomputed').fit(K, np.ravel(y)) x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1 y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1 xx, yy = np.meshgrid(np.arange(x_min, x_max, h), np.arange(y_min, y_max, h)) # 新增:将网格点展平为(n_samples, 2)的特征矩阵 X_test = np.c_[xx.ravel(), yy.ravel()] # 修正:用展平后的测试特征计算核矩阵 K_test = np.array(laplacian_kernel(X_test, X, gamma=.5)) # 修正:直接传入K_test预测,无需多余拼接 Z = svm.predict(K_test) Z = Z.reshape(xx.shape) plt.contourf(xx, yy, Z, cmap=plt.cm.coolwarm, alpha=0.8) plt.scatter(X[:, 0], X[:, 1], c=y, cmap=plt.cm.coolwarm) plt.xlabel('Sepal length') plt.ylabel('Sepal width') plt.xlim(xx.min(), xx.max()) plt.ylim(yy.min(), yy.max()) plt.xticks(()) plt.yticks(()) plt.title('SVC with Laplace kernel') plt.show()
运行上述代码即可正常输出带Laplace核SVM决策边界的鸢尾花分类可视化结果。
内容的提问来源于stack exchange,提问作者user3046211
相关产品推荐
相关产品推荐

