You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:19:24