1083 List Grades (25 point(s))

本文介绍了一个简单的排序问题,要求根据学生的成绩将记录进行非递增排序,并筛选出成绩在特定区间内的学生记录。通过使用C++中的结构体和sort函数,可以轻松实现这一功能。

1083 List Grades (25 point(s))

Given a list of N student records with name, ID and grade. You are supposed to sort the records with respect to the grade in non-increasing order, and output those student records of which the grades are in a given interval.

Input Specification:

Each input file contains one test case. Each case is given in the following format:

N
name[1] ID[1] grade[1]
name[2] ID[2] grade[2]
... ...
name[N] ID[N] grade[N]
grade1 grade2

where name[i] and ID[i] are strings of no more than 10 characters with no space, grade[i] is an integer in [0, 100], grade1 and grade2 are the boundaries of the grade's interval. It is guaranteed that all the grades are distinct.

Output Specification:

For each test case you should output the student records of which the grades are in the given interval [grade1grade2] and are in non-increasing order. Each student record occupies a line with the student's name and ID, separated by one space. If there is no student's grade in that interval, output NONE instead.

Sample Input 1:

4
Tom CS000001 59
Joe Math990112 89
Mike CS991301 100
Mary EE990830 95
60 100

Sample Output 1:

Mike CS991301
Mary EE990830
Joe Math990112

Sample Input 2:

2
Jean AA980920 60
Ann CS01 80
90 95

Sample Output 2:

NONE

简单排序题。对于没给范围的题,申请一个动态结构体数组来完成。

#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
struct record {
	string name;
	string id;
	int grade;
	bool operator < (const record &other) const{
		return grade>other.grade;
	}
};

int main(void){
	int n,g1,g2;cin>>n;
	record *R=new record[n];
	for(int i=0;i<n;i++) cin>>R[i].name>>R[i].id>>R[i].grade; 
	sort(R,R+n);
	cin>>g1>>g2;
	bool flag = false;
	for(int i=0;i<n;i++){
		if(R[i].grade>=g1&&R[i].grade<=g2){
			flag = true; 
			cout<<R[i].name<<" "<<R[i].id<<endl; 
		}
	}
	if(!flag) cout<<"NONE"<<endl;
	return 0;
}

 

#综合成绩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来把聚类的数据投影到二维和三维,我要怎么做,因为我&middot;没有接触过这个,你要说详细一点,解释一下。这里需要在聚类的基础上接着做tsne吗
07-23
<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]: 聚类质量评估需结合目标函数和可视化结果
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值