Sklearn PCA报错unhashable type: 'slice',3D数据降维至2D失败求助
解决PCA降维后可视化的TypeError问题
首先看你代码里的几个关键问题,直接导致了这个错误:
问题1:函数返回的是原始数据,而非降维后的数据
你的do_PCA函数最后返回的是输入的x,也就是原始的3D DataFrame,根本没有返回PCA处理后的2D结果。而且你在函数里写的那行PCA(copy=True, iterated_power='auto', ...)完全是多余的——这只是创建了一个新的PCA实例,但既没赋值给变量,也没用来处理数据,纯粹是无效代码。
问题2:切片方式不匹配数据类型(次要,但也需要注意)
就算你返回了正确的结果,如果原始x是DataFrame,直接用[:,0]这种numpy风格的切片也会报错,因为DataFrame需要用iloc或者loc来索引。不过只要我们返回的是PCA转换后的numpy数组,这个切片方式就没问题了。
修正后的代码
def do_PCA(x, svd_solver): from sklearn.decomposition import PCA # 初始化PCA实例,使用传入的svd_solver参数(你之前硬编码成'full'了,浪费参数) pca = PCA(n_components=2, svd_solver=svd_solver) # 先拟合数据,再转换得到降维后的2D结果 reduced_data = pca.fit_transform(x) # 返回降维后的数据,而不是原始x return reduced_data # 调用函数得到降维后的2D数组 pca_data = do_PCA(x, "full") fig = plt.figure() ax = fig.add_subplot(111) ax.set_title('Full PCA') # 现在pca_data是numpy数组,可以用[:,0]和[:,1]取列 ax.scatter(pca_data[:,0], pca_data[:,1], c='blue', marker='.', alpha=0.75) plt.show()
关键修改点说明
- 移除了那行无用的
PCA(...)代码。 - 用
fit_transform(x)替代分开的fit(x)和手动转换——这个方法会一次性完成拟合和数据转换,返回降维后的numpy数组。 - 函数返回的是
reduced_data(降维后的结果),而不是原始的x。 - 把变量名从
pca改成pca_data,避免和PCA实例混淆,可读性更好。 - 把PCA初始化里的
svd_solver='full'改成传入的参数svd_solver,这样你的函数参数才有用,不然传"full"进去根本没用到。
这样修改后,你就能得到正确的2D降维数据,然后正常用散点图可视化了。
内容的提问来源于stack exchange,提问作者Pepin Peng
相关产品推荐
相关产品推荐

