#综合成绩df_grades、任务点完成详情df_point、章节测验统计df_quizzes、考试统计 df_grades=pd.read_excel(r'E:\20241171-专业1_统计一键导出.xlsx',sheet_name='综合成绩',skiprows=2) 学生姓名 学号/工号 院系 专业 班级 章节任务点(5%) 章节测验(10%) 作业(40%) 考试(30%) 签到(5%) 课程积分(10%) 综合成绩 0 学生1 2024117101 学院1 专业1 20241171 3.07 4.96 28.8 19.5 4.33 5 65.66 1 学生2 2024117102 学院1 专业1 20241171 4.77 9.18 36.0 16.5 4.67 10 81.12 2 学生3 2024117103 学院1 专业1 20241171 5.00 8.35 36.0 20.7 4.67 10 84.72 3 学生4 2024117104 学院1 专业1 20241171 4.89 8.82 36.0 16.2 4.6 df_point['学号/工号'] = df_point['学号/工号'].astype(int) # 将"已完成"替换为1,"未完成"替换为0 df_point = df_point.replace({'已完成':1, '未完成': 0}) merged_df = pd.merge(df_grades, df_point, on='学号/工号', how='left')merged_df = merged_df.drop(columns=['学生姓名', '院系', '专业', '班级'])#计算任务完成率 task_columns = [col for col in merged_df.columns if col.endswith('.mp4') or col.endswith('.pptx')] merged_df['任务完成率'] = merged_df[task_columns].mean(axis=1) grade_features = ['章节任务点(5%)', '章节测验(10%)', '作业(40%)', '考试(30%)', '签到(5%)', '课程积分(10%)'] X = merged_df[grade_features] Y = merged_df[['任务完成率']]#特征标准化 grade_scaler = StandardScaler().fit(X) X_scaled = grade_scaler.fit_transform(X) task_scaler = StandardScaler().fit(Y) Y_scaled = task_scaler.transform(Y)# PCA降维 pca = PCA(n_components=1) # 降至1维 X_pca = pca.fit_transform(X_scaled) X_pca = -X_pca # 组合特征(X轴=成绩PCA,Y轴=任务完成度) combined_features = np.hstack((X_pca, Y_scaled)) # KMeans聚类 kmeans = KMeans(n_clusters=3, random_state=42,n_init=10) clusters = kmeans.fit_predict(combined_features) # 分离成绩和任务部分 grade_centers = kmeans.cluster_centers_[:, :1] # 成绩PCA部分 task_centers = kmeans.cluster_centers_[:, 1:] # 任务部分 # 逆变换成绩部分 grade_centers_restored = pca.inverse_transform(grade_centers) # 还原到6维标准化空间 grade_centers_original = grade_scaler.inverse_transform(grade_centers_restored) # 还原到原始成绩 # 逆变换任务部分 task_centers_original = task_scaler.inverse_transform(task_centers) # 合并结果 cluster_centers_original = np.hstack((grade_centers_original, task_centers_original)) # 创建DataFrame feature_names = X.columns.tolist() + ['任务完成率'] cluster_center_df = pd.DataFrame(cluster_centers_original, columns=feature_names) print("各聚类中心实际特征值:") display(cluster_center_df) 章节任务点(5%) 章节测验(10%) 作业(40%) 考试(30%) 签到(5%) 课程积分(10%) 任务完成率 0 3.763759 6.265802 31.862586 16.766125 4.359226 9.327531 0.983806 1 7.465528 12.938833 47.649160 27.198091 5.972354 11.442964 0.163158 2 4.783249 8.103595 36.210304 19.639151 4.803491 9.910134 0.788278 x_data = X_pca.flatten() # 将二维数组转为一维 y_data = merged_df['任务完成率'].values center_x = kmeans.cluster_centers_[:, 0] # 聚类中心在PCA空间的X值 center_y =kmeans.cluster_centers_[:, 1] #center_y = cluster_center_df['任务完成率'].values# 查看第一主成分的权重向量 weights = pca.components_[0] for i, feature in enumerate(grade_features): print(f"{feature}: {weights[i]:.4f}")章节任务点(5%): -0.4678 章节测验(10%): -0.4299 作业(40%): -0.4434 考试(30%): -0.3644 签到(5%): -0.4462 课程积分(10%): -0.2607# 创建画布 plt.figure(figsize=(10, 6)) # 绘制各聚类散点 plt.scatter(x_data[clusters == 0], y_data[clusters == 0], c='purple', alpha=0.7, s=80, label="稳定优秀型") plt.scatter(x_data[clusters == 2], y_data[clusters == 2], c='green', alpha=0.7, s=80, label="潜力提升型") plt.scatter(x_data[clusters ==1], y_data[clusters == 1], c='orange', alpha=0.7, s=80, label="待提升型") plt.xlabel("综合成绩(降维后)", fontsize=12) plt.ylabel("任务完成率", fontsize=12) plt.legend(title="学生类型", loc='upper left', frameon=True, edgecolor='black')老师让我你接下来试一下用sklearn里面的tsne来把聚类的数据投影到二维和三维,我要怎么做,因为我·没有接触过这个,你要说详细一点,解释一下。这里需要在聚类的基础上接着做tsne吗
时间: 2025-07-22 22:20:49 浏览: 11
<think>我们使用t-SNE对聚类后的数据进行降维可视化。t-SNE(t-Distributed Stochastic Neighbor Embedding)是一种非线性降维技术,特别适用于高维数据的可视化。它将高维数据映射到低维(通常是2维或3维)空间,同时保持数据点之间的局部结构。
步骤概述:
1. 准备数据:包括特征数据和聚类标签(如果有的话)
2. 使用t-SNE进行降维:将高维数据降为2维或3维
3. 可视化:将降维后的数据点按照聚类标签着色绘制在二维或三维坐标系中
详细步骤:
步骤1:导入必要的库
我们将使用numpy处理数据,matplotlib进行二维绘图,mpl_toolkits.mplot3d进行三维绘图,sklearn中的TSNE进行降维。
步骤2:加载或生成数据
假设我们已经有聚类好的数据。这里,我们使用一个示例数据集(如鸢尾花数据集)并先进行聚类(例如使用KMeans)。
步骤3:应用t-SNE降维
创建TSNE对象,设置降维后的维度(n_components=2或3),然后对原始特征数据进行降维。
步骤4:可视化
根据降维后的坐标,将每个数据点绘制在二维或三维空间中,并根据聚类标签赋予不同的颜色。
注意:t-SNE只能用于变换训练数据,不能用于新数据(即没有transform方法,只有fit_transform)。因此,我们直接对整个数据集进行降维。
下面我们以鸢尾花数据集为例,展示完整的代码和步骤。
详细代码:
注意:由于t-SNE的随机性,每次运行结果可能略有不同,我们可以通过设置random_state来固定随机种子。</think>### 使用 t-SNE 可视化聚类数据的步骤详解
#### 1. **环境准备**
```python
import numpy as np
import matplotlib.pyplot as plt
from sklearn.manifold import TSNE
from sklearn.cluster import KMeans
from sklearn.datasets import load_iris
from mpl_toolkits.mplot3d import Axes3D # 三维可视化支持
```
#### 2. **数据准备与聚类**
```python
# 加载示例数据集(此处以鸢尾花数据集为例)
data = load_iris()
X = data.data # 特征矩阵 (150个样本×4维)
y = data.target # 真实标签(仅用于可视化对比)
# 执行聚类(此处使用KMeans,实际可替换为其他聚类算法)
kmeans = KMeans(n_clusters=3, random_state=42)
cluster_labels = kmeans.fit_predict(X) # 获取聚类标签
```
#### 3. **t-SNE 降维**
```python
# 二维降维
tsne_2d = TSNE(
n_components=2, # 降维至2维
perplexity=30, # 建议取值5-50,控制局部结构敏感度
random_state=42
)
X_2d = tsne_2d.fit_transform(X)
# 三维降维
tsne_3d = TSNE(
n_components=3, # 降维至3维
perplexity=30,
random_state=42
)
X_3d = tsne_3d.fit_transform(X)
```
#### 4. **可视化结果**
**二维可视化**
```python
plt.figure(figsize=(10, 6))
scatter = plt.scatter(
X_2d[:, 0], X_2d[:, 1],
c=cluster_labels, # 按聚类标签着色
cmap='viridis',
s=50, # 点大小
alpha=0.8
)
plt.colorbar(scatter, label='Cluster ID')
plt.title('t-SNE 2D Visualization of Clusters')
plt.xlabel('t-SNE Dimension 1')
plt.ylabel('t-SNE Dimension 2')
plt.show()
```
**三维可视化**
```python
fig = plt.figure(figsize=(12, 8))
ax = fig.add_subplot(111, projection='3d')
scatter_3d = ax.scatter(
X_3d[:, 0], X_3d[:, 1], X_3d[:, 2],
c=cluster_labels,
cmap='viridis',
s=50,
depthshade=True
)
fig.colorbar(scatter_3d, label='Cluster ID')
ax.set_title('t-SNE 3D Visualization of Clusters')
ax.set_xlabel('t-SNE Dim 1')
ax.set_ylabel('t-SNE Dim 2')
ax.set_zlabel('t-SNE Dim 3')
plt.show()
```
#### 关键参数说明
1. **`n_components`**
- 2:二维散点图
- 3:三维散点图
2. **`perplexity`**
控制局部/全局结构的平衡,值越小越关注局部结构。通常取5-50,建议尝试不同值
3. **`random_state`**
固定随机种子保证结果可复现
4. **`learning_rate`**
优化步长(默认200),复杂数据集可尝试100-1000
#### 注意事项
1. t-SNE **不能用于新数据**的转换,仅适用于当前数据集的可视化[^3]
2. 距离尺度无实际意义,坐标轴仅表示相对位置
3. 不同聚类算法结果可能显著影响可视化效果
4. 高维数据建议先进行PCA预处理(`init='pca'`)
> 可视化效果解读:相同颜色的点表示被划分到同一聚类簇,在降维空间中距离越近的样本相似度越高。但需注意t-SNE可能扭曲全局结构,需结合聚类评估指标分析[^5]。
---
### 相关问题
1. **如何选择 t-SNE 的最佳 perplexity 参数?**
2. **t-SNE 与 PCA 在聚类可视化中的主要区别是什么?**
3. **如何量化评估 t-SNE 可视化后的聚类质量?**
4. **处理大规模数据时如何优化 t-SNE 的计算效率?**
[^1]: 数据可视化工具选择需考虑维度需求和交互性
[^3]: t-SNE 属于非监督降维,无法直接用于新数据
[^5]: 聚类质量评估需结合目标函数和可视化结果
阅读全文
相关推荐


















