Matplotlib散点图绘制t-SNE可视化时出现维度不匹配ValueError问题求助
解决t-SNE散点图的ValueError:维度不匹配与RGBA错误
看起来你踩了一个很典型的新手坑——标签数据和特征数据加载重复了,这直接导致了连锁的错误。我来一步步帮你拆解问题,搞定这个报错:
核心问题分析
先看你代码里的这两行:
X = np.loadtxt("ecg_test_tsne_randomremoved_tagremoved.txt") labels = np.loadtxt("ecg_test_tsne_randomremoved_tagremoved.txt")
你把同一个数据文件既当成了特征矩阵X,又当成了标签数组labels!假设你的ECG数据是「每行前半部分是特征,最后一列是标签」的结构,那X会是一个(2500, N)的二维数组(2500个样本,每个样本N个特征),而labels加载后也是一模一样的二维数组,总元素数就是2500*N=470000——这正好对应错误提示里的“'c'参数包含470000个元素,与大小为2500的'x'和'y'参数不一致”。
当matplotlib收到二维数组作为c参数时,会误以为你要直接指定每个点的RGBA颜色,但数组长度不符合3或4的要求,于是又触发了第二个RGBA相关的ValueError。
一步一步修正
1. 正确拆分特征和标签
首先得明确你的数据文件结构:
- 如果
ecg_test_tsne_randomremoved_tagremoved.txt里每行最后一列是标签,前面是特征,先加载整个数据集再拆分:# 先加载完整数据 data = np.loadtxt("ecg_test_tsne_randomremoved_tagremoved.txt") # 取所有行、除最后一列的部分作为特征矩阵X X = data[:, :-1] # 取所有行的最后一列作为标签数组labels labels = data[:, -1] - 如果标签是单独存放在另一个文件(比如
ecg_test_labels.txt),直接加载正确的标签文件即可:labels = np.loadtxt("ecg_test_labels.txt")
2. 验证维度是否匹配
修正后一定要加几行打印代码确认:
print(f"X的形状:{X.shape}") # 应该是(2500, 特征数),比如(2500, 188) print(f"labels的形状:{labels.shape}") # 必须是(2500,)——一维数组,长度和样本数一致 print(f"t-SNE输出Y的形状:{Y.shape}") # 应该是(2500, 2),每个样本对应一个二维坐标
只要labels.shape是(2500,),就说明维度匹配了。
3. 修正后的完整代码
这里给你整理好可以直接运行的版本:
import numpy as np import pylab import tsne # 确保这是van der Maaten的t-SNE实现 if __name__ == "__main__": print("Run Y = tsne.tsne(X, no_dims, perplexity) to perform t-SNE on your dataset.") print("Running example on ECG samples...") # 正确加载并拆分特征与标签 data = np.loadtxt("ecg_test_tsne_randomremoved_tagremoved.txt") X = data[:, :-1] labels = data[:, -1] # 验证维度(可选,但排查问题很有用) print(f"X shape: {X.shape}, Labels shape: {labels.shape}") # 执行t-SNE降维 Y = tsne(X, 2, 50, 20.0) print(f"t-SNE output shape: {Y.shape}") # 绘制散点图,c参数用一维labels就没问题了 pylab.scatter(Y[:, 0], Y[:, 1], s=20, c=labels) pylab.colorbar() # 加个颜色条,方便对应标签与颜色 pylab.show()
额外排查小技巧
- 如果加载标签后还是二维数组,检查文件分隔符:比如是逗号分隔的CSV,要加
delimiter=','参数:np.loadtxt("xxx.txt", delimiter=',') - 如果标签是字符串(比如"normal"、"abnormal"),用
dtype=str加载,matplotlib会自动给不同字符串分配不同颜色:labels = np.loadtxt("xxx.txt", dtype=str) - 要是搞不清数据结构,用
print(data[:2])打印前两行数据,就能直观看到每行的结构了。
内容的提问来源于stack exchange,提问作者SAS2507
相关产品推荐
相关产品推荐

