qq_53216250 晚上好🌙🌙🌙
本答案参考ChatGPT-3.5
问题分析: 在使用t-sne可视化csv数据集时,报错信息为IndexError: list index out of range,原因是在for循环中访问了超出列表范围的索引。
解决方案:
- 检查label_list列表的长度是否与np.unique(labels)的长度相等,如果不相等,需要重新定义label_list,确保与标签种类数量一致。
- 确保shape_list和color_list的长度大于或等于标签种类数量,在此处可以使用循环列表的方式避免越界错误。
- 检查labels的维度是否为二维,如果是一维,请转换成二维。
- 检查labels的数据类型是否为整数类型,如果不是,请转换为整数类型。
修改后的代码如下:
import numpy as np
import matplotlib.pyplot as plt
from sklearn.manifold import TSNE
import pandas as pd
# 加载自己的数据集和标签
X = pd.read_csv("/root/autodl-tmp/376data.csv", header=None) # 替换为你的数据集路径
labels = pd.read_csv("/root/autodl-tmp/376label.csv", header=None) # 替换为你的标签路径
# 使用t-SNE进行降维
tsne = TSNE(n_components=2, random_state=42)
X_tsne = tsne.fit_transform(X)
# 归一化
x_min, x_max = X_tsne.min(0), X_tsne.max(0)
X_norm = (X_tsne - x_min) / (x_max - x_min)
# 绘制t-SNE可视化图
plt.figure(figsize=(10, 8))
plt.rcParams['font.sans-serif'] = ['Times New Roman'] # 图中文字体设置为Times New Roman
# 设置不同类别的形状和颜色
shape_list = ['o', 'D', '^', 'P', 's', 'x', '*', '+']
color_list = ['r', 'g', 'b', 'm', 'c', 'y', 'k', 'orange', 'purple', 'brown', 'pink']
# 遍历所有标签种类
label_list = ['SiO2', 'TiO2', 'Al2O3', 'FeOT', 'MgO', 'CaO', 'Na2O', 'K2O']
for i in range(len(np.unique(labels.values))):
idx = np.where(labels.values.flatten() == i)[0]
plt.scatter(X_norm[idx][:, 0], X_norm[idx][:, 1], color=color_list[i % len(color_list)],
marker=shape_list[i % len(shape_list)], s=150, label=label_list[i], alpha=0.5)
# 添加图例,并设置字体大小
plt.legend(fontsize=20)
ax = plt.gca()
ax.spines['right'].set_linewidth('2.0')
ax.spines['top'].set_linewidth('2.0')
ax.spines['bottom'].set_linewidth('2.0')
ax.spines['left'].set_linewidth('2.0')
plt.xticks(fontsize=20)
plt.yticks(fontsize=20)
plt.xlabel('t-SNE Dimension 1', fontsize=20)
plt.ylabel('t-SNE Dimension 2', fontsize=20)
plt.title('t-SNE Visualization', fontsize=24)
plt.show()
plt.savefig('./visualization.png', dpi=600)
注意事项:
- 在绘制图像之前,一定要确保label_list、shape_list和color_list的长度应适配和符合数据集的实际情况。
- 如果仍有错误,请检查数据集路径和标签路径是否正确,并确认数据集和标签的内容是否符合要求。