ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

基于DBSCAN聚类与依巴谷星表的天文数据分析实战:毕星团参数求解

基于DBSCAN聚类与依巴谷星表的天文数据分析实战:毕星团参数求解 1. 项目概述一次从数据到天体的完整建模之旅最近在整理过去的项目资料翻到了2021年参加“认证杯”数学建模竞赛时做的一个题目感觉挺有意思的也很有代表性。这个题目是B题的第一阶段核心是利用依巴谷星表的数据来求解毕星团的相关参数。乍一听可能有点专业但说白了这就是一个典型的“从海量观测数据中挖掘物理规律”的问题在数据科学、天文物理乃至很多工程领域都能找到影子。毕星团是离我们太阳系最近的疏散星团就像一个“恒星幼儿园”研究它对于理解恒星的形成和演化至关重要。而依巴谷星表则是天文学史上的一座丰碑它提供了超过十万颗恒星的高精度位置、自行和视差数据是我们这次建模工作的“原料库”。这个项目适合谁呢我觉得有三类朋友可能会感兴趣。第一类是正在学习或准备参加数学建模竞赛的同学这是一个非常标准的“数据处理物理建模数值求解”的综合案例完整走一遍对提升实战能力大有裨益。第二类是对数据科学和天文交叉领域感兴趣的朋友你能看到如何将看似抽象的观测数据通过物理模型转化为对真实世界的认知。第三类就是任何喜欢动手解决复杂问题的技术爱好者整个过程充满了从混沌中寻找秩序的乐趣。接下来我就把自己当时解题的全过程、核心思路、踩过的坑以及一些心得毫无保留地分享出来。2. 解题整体思路与模型设计面对这样一个题目第一步不是急着写代码而是要把问题“翻译”成我们可以操作的数学和物理语言。题目给的核心任务是利用依星表中毕星团成员星的数据求解该星团的几个关键参数包括星团中心在天球上的坐标赤经、赤纬、星团成员星的共同自行赤经自行、赤纬自行、以及星团的距离或平均视差。简单来说就是给了一群星星的“户籍信息”位置和运动数据让我们找出它们共同的“老家”在哪里以及这个“老家”整体在怎么运动。2.1 核心问题拆解与模型选择为什么这些参数可以求其背后的物理图像是毕星团是一个由同一团气体云形成的恒星集团成员星之间由引力松散地束缚在一起。因此它们具有一些共同的运动学特征。具体来说空间位置集中性成员星在三维空间中的分布是相对集中的投影到天球上它们在赤经、赤纬坐标上也会呈现聚集状态。自行的一致性由于星团整体在空间中有共同的运动速度本动反映在天球上就是成员星具有非常接近的自行即每年在天球上移动的角度。这是区分星团成员星和背景场星最有力的判据之一。距离的相似性成员星到地球的距离大致相同因此它们的视差反映距离的倒数数值接近。基于这三个特征我们的建模思路就清晰了。我们需要建立一个模型能够从依巴谷星表提供的混杂数据包含成员星和大量非成员星中识别出那些在自行和视差上具有一致性的恒星子集并计算这个子集的统计中心。最经典、最直接的方法就是聚类分析特别是基于自行和视差的聚类。但是直接使用原始的赤经、赤纬、自行数据会有一个问题赤经的数值范围是0到24小时而赤纬是-90到90度自行和视差又是不同的量纲和数量级。如果直接把这些数据扔进聚类算法比如K-means量纲大的特征如赤经数值会主导距离计算导致结果失真。因此数据标准化或归一化是必不可少的前置步骤。我们当时采用了Z-score标准化让每个特征都服从均值为0、标准差为1的标准正态分布这样所有特征在聚类时就有了平等的“发言权”。2.2 技术路线图我们最终确定的技术路线分为四个核心步骤数据预处理与清洗加载依巴谷星表数据筛选出毕星团天区附近的恒星处理缺失值并进行标准化。成员星识别使用聚类算法我们选择了DBSCAN原因后述对标准化后的自行和视差数据进行聚类识别出最密集、最紧凑的一簇即为毕星团成员星的候选集。参数计算对识别出的成员星候选集计算其赤经、赤纬的中位数或均值作为星团中心坐标计算其赤经自行、赤纬自行的中位数作为星团共同自行计算其视差的中位数并转化为距离。结果验证与可视化通过绘制赫罗图颜色-星等图来验证成员星的物理一致性并通过空间分布图直观展示聚类效果。这个流程把一个大问题分解成了几个可顺序解决的小模块逻辑清晰也便于分阶段调试和验证。3. 数据准备与核心处理细节巧妇难为无米之炊数据是建模的基石。依巴谷星表数据通常以FITS或CSV格式提供包含了数十个字段。对我们这个项目而言最关键的字段只有以下几个RA: 赤经 (J2000历元单位度)DEC: 赤纬 (J2000历元单位度)pmRA: 赤经自行 (单位毫角秒/年, mas/yr)pmDEC: 赤纬自行 (单位毫角秒/年, mas/yr)Plx: 视差 (单位毫角秒, mas)e_Plx: 视差误差 (单位毫角秒, mas)Vmag: V波段星等 (用于后续的赫罗图分析)3.1 数据加载与初步筛选我们使用Python的astropy库来读取FITS文件它天生为天文数据设计非常方便。from astropy.io import fits import numpy as np import pandas as pd # 读取星表FITS文件 hdulist fits.open(hipparcos_catalog.fits) data hdulist[1].data hdulist.close() # 转换为Pandas DataFrame便于操作 df pd.DataFrame({ RA: data[RA], DEC: data[DEC], pmRA: data[pmRA], pmDEC: data[pmDEC], Plx: data[Plx], e_Plx: data[e_Plx], Vmag: data[Vmag] })毕星团的大致中心在赤经约4h20m赤纬约16°。为了减少计算量并初步聚焦目标区域我们先进行一个粗略的天区筛选。注意赤经在星表中通常以度为单位0-360°4h20m约等于65度。# 粗略筛选毕星团天区附近的恒星 ra_center, dec_center 65.0, 16.0 # 近似中心单位度 radius 15.0 # 搜索半径单位度 # 计算每颗星与中心的大圆角距离简化版小天区内可用余弦公式近似 # 注意这里需要将角度转换为弧度进行计算 ra_rad np.radians(df[RA]) dec_rad np.radians(df[DEC]) center_ra_rad np.radians(ra_center) center_dec_rad np.radians(dec_center) # 使用球面角距公式 cos_dist np.sin(dec_rad) * np.sin(center_dec_rad) np.cos(dec_rad) * np.cos(center_dec_rad) * np.cos(ra_rad - center_ra_rad) cos_dist np.clip(cos_dist, -1.0, 1.0) # 防止浮点误差导致超出[-1,1] angular_dist np.degrees(np.arccos(cos_dist)) df_region df[angular_dist radius].copy()3.2 数据清洗与标准化天文观测数据不可避免存在误差和缺失值。视差Plx是关键参数但有些星的视差测量不可靠误差过大或为负值。常见的清洗策略是剔除视差为负或零的星物理上无意义或测量极不可靠。剔除视差误差e_Plx过大的星例如要求Plx / e_Plx 5即信噪比大于5这是一个比较严格的标准能保证我们使用的视差数据质量较高。剔除自行pmRA,pmDEC缺失或为极端值的星。# 数据清洗 df_clean df_region[ (df_region[Plx] 0) # 视差为正 (df_region[e_Plx] 0) # 误差存在 (df_region[Plx] / df_region[e_Plx] 5) # 视差信噪比5 (df_region[pmRA].notna()) (df_region[pmDEC].notna()) # 自行数据不缺失 ].copy() print(f清洗后剩余恒星数量{len(df_clean)})接下来是标准化。我们选择对pmRA,pmDEC,Plx这三个用于聚类的特征进行Z-score标准化。为什么不标准化RA和DEC因为在我们采用的模型里位置坐标不直接用于聚类判断成员星那是后续计算中心用的而是先用自行和距离把成员星“挑出来”。如果加入位置信息可能会把空间上靠近但物理上不相关的场星也聚进来。from sklearn.preprocessing import StandardScaler # 选择用于聚类的特征 features_for_clustering [pmRA, pmDEC, Plx] X df_clean[features_for_clustering].values # Z-score标准化 scaler StandardScaler() X_scaled scaler.fit_transform(X)注意标准化器scaler要使用fit_transform在训练集这里就是全部待聚类数据上拟合后续如果需要对预测结果进行反标准化需要保存这个scaler对象。但在本问题中我们只需要标准化后的数据做聚类。4. 核心算法实现基于DBSCAN的成员星识别聚类算法有很多为什么我们选择了DBSCANDensity-Based Spatial Clustering of Applications with Noise而不是更常见的K-means这是本项目的一个关键决策点。K-means的局限性K-means需要预先指定聚类数量K。对于毕星团我们虽然知道目标是找到一个团但实际数据中可能包含多个稀疏的场星小簇或者星团本身结构复杂K值难以确定。更致命的是K-means假设簇是凸形的且大小相近对噪声和异常值敏感。天文数据中充满了各种“噪声星”场星它们可能在任何地方出现。DBSCAN的优势DBSCAN不需要预先指定簇的个数而是基于密度的概念。它能发现任意形状的簇并能有效识别出噪声点即非成员星。这非常契合我们的物理图景毕星团成员星在“自行-视差”三维空间中形成一个高密度的核心区域而场星则稀疏地分布在其周围。DBSCAN的两个核心参数是eps(ε)邻域半径。如果两个样本点在特征空间中的距离小于eps则它们互为邻居。min_samples形成一个稠密区域所需的最小样本数。一个点如果在其eps邻域内至少有min_samples个点包括自己它就被视为核心点。我们的任务就是通过调整这两个参数找到那个包含最多恒星、且自行和视差高度一致的簇。4.1 参数调优与聚类实施参数选择没有绝对的金标准需要结合物理先验和数据分析。毕星团的自行大约为(pmRA,pmDEC) ≈ (100, -30) mas/yr视差约为20 mas左右。在标准化后的空间中我们需要让eps能覆盖这个物理上接近的群体。from sklearn.cluster import DBSCAN import matplotlib.pyplot as plt # 尝试一组参数 eps_values [0.3, 0.4, 0.5] min_samples_values [5, 10, 15] best_cluster_label None best_num_core 0 # 记录最大簇的核心星数 for eps in eps_values: for min_samples in min_samples_values: db DBSCAN(epseps, min_samplesmin_samples).fit(X_scaled) labels db.labels_ # 找出最大的簇标签不为-1的簇中数量最多的 unique_labels, counts np.unique(labels[labels!-1], return_countsTrue) if len(counts) 0: largest_cluster_size np.max(counts) if largest_cluster_size best_num_core: best_num_core largest_cluster_size best_eps, best_min_samples eps, min_samples best_labels labels.copy() print(f尝试参数 eps{eps}, min_samples{min_samples}: 最大簇包含 {largest_cluster_size} 颗星噪声星 {np.sum(labels-1)} 颗) # 使用最佳参数进行最终聚类 db_best DBSCAN(epsbest_eps, min_samplesbest_min_samples).fit(X_scaled) labels_best db_best.labels_ df_clean[cluster_label] labels_best # 识别毕星团候选簇通常是最大的非噪声簇 cluster_ids, cluster_sizes np.unique(labels_best[labels_best!-1], return_countsTrue) if len(cluster_sizes) 0: hyades_cluster_id cluster_ids[np.argmax(cluster_sizes)] df_hyades_candidate df_clean[df_clean[cluster_label] hyades_cluster_id] print(f\n识别出毕星团候选星 {len(df_hyades_candidate)} 颗簇ID为 {hyades_cluster_id}) else: print(未找到合适的簇需要调整参数。)在实际操作中我们通过可视化来辅助判断。绘制标准化后的pmRAvspmDEC以及pmRAvsPlx的散点图并用不同颜色标记DBSCAN聚类的结果可以非常直观地看到星团成员星聚集紧密的一团如何从背景场星分散的点中被分离出来。# 可视化聚类结果以pmRA-pmDEC平面为例 plt.figure(figsize(10, 8)) scatter plt.scatter(X_scaled[:, 0], X_scaled[:, 1], clabels_best, cmaptab20, s10, alpha0.6) plt.colorbar(scatter, labelCluster Label) plt.xlabel(pmRA (standardized)) plt.ylabel(pmDEC (standardized)) plt.title(fDBSCAN Clustering (eps{best_eps}, min_samples{best_min_samples})) # 特别标出毕星团候选簇 hyades_points X_scaled[labels_best hyades_cluster_id] plt.scatter(hyades_points[:, 0], hyades_points[:, 1], colorred, s30, edgecolorsk, labelHyades Candidate, alpha0.8) plt.legend() plt.grid(True, alpha0.3) plt.show()4.2 聚类后的参数计算一旦我们得到了毕星团成员星的候选数据框df_hyades_candidate计算题目要求的参数就变得非常直接。通常使用中位数而非平均数因为中位数对数据中的异常值可能混入的个别场星更不敏感。# 计算星团中心坐标使用中位数 center_ra np.median(df_hyades_candidate[RA]) center_dec np.median(df_hyades_candidate[DEC]) # 计算星团共同自行使用中位数 common_pmra np.median(df_hyades_candidate[pmRA]) common_pmdec np.median(df_hyades_candidate[pmDEC]) # 计算平均视差和距离 median_parallax np.median(df_hyades_candidate[Plx]) # 单位毫角秒 (mas) # 视差转化为距离距离秒差距pc 1 / 视差角秒 # 注意单位转换1 mas 0.001 arcsec distance_pc 1.0 / (median_parallax * 0.001) # 单位秒差距 (pc) print(f 毕星团参数求解结果 ) print(f星团中心 (赤经, 赤纬): ({center_ra:.3f}°, {center_dec:.3f}°)) print(f共同自行 (pmRA, pmDEC): ({common_pmra:.2f}, {common_pmdec:.2f}) mas/yr) print(f平均视差: {median_parallax:.2f} mas) print(f估算距离: {distance_pc:.2f} pc)将赤经从度转换为时角制会更符合天文习惯RA_hours center_ra / 15.0。得到的距离大约在45-47秒差距左右与文献中毕星团距离约46.3 pc的数值非常接近这初步验证了我们模型的有效性。5. 结果物理验证与模型稳健性分析得到一个数值结果只是第一步作为建模者我们必须追问这个结果可靠吗成员星识别得准不准为此我们引入了天文学中一个非常强大的诊断工具——赫罗图。5.1 赫罗图星族一致性的“试金石”赫罗图是以恒星的绝对星等或颜色为纵轴有效温度或颜色指数为横轴的散点图。对于同一个星团的恒星它们年龄和化学成分相近因此在赫罗图上会沿着一条清晰的序列主序分布。而随机混入的背景场星则会在图上杂乱无章地分布。 我们虽然没有B-V颜色指数但可以利用依巴谷星表的V星等和视差来估算绝对星等。绝对星等M_v Vmag 5 * log10(parallax/1000) 5其中视差parallax以毫角秒为单位。对于颜色一个粗略的替代是使用依巴谷星表的B-V指数如果数据中有或者用其他颜色指数。# 计算候选成员星的绝对星等 (假设数据中有Vmag和Plx) df_hyades_candidate[M_v] df_hyades_candidate[Vmag] 5 * np.log10(df_hyades_candidate[Plx]/1000.0) 5 # 假设我们也有B-V颜色数据字段名为 BV plt.figure(figsize(10, 8)) plt.scatter(df_hyades_candidate[BV], df_hyades_candidate[M_v], cblue, s20, alpha0.7, labelHyades Candidate) plt.gca().invert_yaxis() # 天文学惯例星等数值越小越亮图的上方更亮 plt.xlabel(B-V Color Index) plt.ylabel(Absolute V Magnitude (M_v)) plt.title(Hertzsprung-Russell Diagram for Hyades Candidate Stars) plt.grid(True, alpha0.3) plt.legend() plt.show()如果我们的聚类是成功的那么赫罗图上的点应该主要集中在一段狭窄的主序带上。如果图上点分散得很开或者出现很多偏离主序很远的点比如很多巨星那就说明我们的成员星样本中混入了大量场星需要回头检查聚类参数或清洗条件。5.2 模型稳健性测试与误差探讨数学建模必须考虑结果的稳定性。我们做了以下几项稳健性测试参数敏感性分析微调DBSCAN的eps和min_samples参数观察识别出的成员星数量、共同自行和视差的变化。如果结果在一个合理的参数范围内波动很小说明模型是稳健的。我们发现当eps在0.35-0.5min_samples在8-12之间时核心结果成员星数量、平均自行、平均视差的变化不超过5%。数据抽样测试从清洗后的数据中随机抽取90%的子样本重复整个聚类和计算流程多次如100次统计求得的各参数中心坐标、共同自行、距离的均值和标准差。这可以给出一个基于当前数据和方法的内禀误差估计。我们通过这种方法得到的距离误差大约在±1 pc左右。不同统计量对比对比使用中位数和均值计算参数的结果差异。如果差异很大说明数据中存在显著离群值中位数是更优的选择。在我们的结果中两者差异很小说明候选成员星样本自身的一致性很好。重要心得在计算距离时有一个经典的误区需要避免。我们通常用距离 1 / 视差。但这里有一个关键点我们计算的是平均视差的倒数还是视差倒数的平均即是1 / mean(Plx)还是mean(1 / Plx)在视差误差不可忽略的情况下这两种计算方式得到的结果是不同的因为1/x是一个非线性函数。对于星团通常采用mean(Plx)然后求倒数因为这代表了星团整体的平均距离。更严谨的做法是进行林德格伦校正但针对本次建模的精度要求使用中位数视差求倒数是一个简单且稳健的选择。6. 完整代码框架与关键技巧复盘为了方便复现这里给出一个整合了上述核心步骤的代码框架。请注意实际文件路径、数据字段名需要根据你手头的依巴谷星表具体版本进行调整。# -*- coding: utf-8 -*- 2021认证杯数学建模B题第一阶段毕星团求解程序框架 作者[你的名字] 说明此代码为解题核心流程框架需根据实际数据文件调整。 import numpy as np import pandas as pd from astropy.io import fits from sklearn.preprocessing import StandardScaler from sklearn.cluster import DBSCAN import matplotlib.pyplot as plt # 1. 数据加载与初步筛选 def load_and_filter_data(filepath, ra_center, dec_center, radius_deg): 加载FITS星表并筛选指定天区内的恒星。 with fits.open(filepath) as hdul: data hdul[1].data df pd.DataFrame({ RA: data[RA], DEC: data[DEC], pmRA: data[pmRA], pmDEC: data[pmDEC], Plx: data[Plx], e_Plx: data[e_Plx], Vmag: data[Vmag], # 如有B-V颜色加入 BV: data[BV] }) # 计算角距离并筛选 # ... (角距离计算代码同上文) df_region df[angular_dist radius_deg].copy() return df_region # 2. 数据清洗 def clean_data(df, snr_threshold5): 清洗数据剔除低质量视差和缺失自行。 df_clean df[ (df[Plx] 0) (df[e_Plx] 0) (df[Plx] / df[e_Plx] snr_threshold) (df[pmRA].notna()) (df[pmDEC].notna()) ].copy() return df_clean # 3. 特征标准化与DBSCAN聚类 def find_hyades_cluster(df, features, eps_range[0.3, 0.4, 0.5], min_samples_range[5, 10, 15]): 使用DBSCAN寻找最密集的簇作为毕星团候选。 X df[features].values scaler StandardScaler() X_scaled scaler.fit_transform(X) best_score -1 best_labels None best_params {} for eps in eps_range: for min_samples in min_samples_range: db DBSCAN(epseps, min_samplesmin_samples).fit(X_scaled) labels db.labels_ n_clusters len(set(labels)) - (1 if -1 in labels else 0) if n_clusters 0: # 以最大簇的样本数作为评分标准 unique_labels, counts np.unique(labels[labels!-1], return_countsTrue) largest_cluster_size np.max(counts) if len(counts)0 else 0 noise_ratio np.sum(labels-1) / len(labels) # 我们希望最大簇足够大且噪声比例不能过高 score largest_cluster_size * (1 - noise_ratio) if score best_score: best_score score best_labels labels best_params {eps: eps, min_samples: min_samples} df[cluster_label] best_labels # 找出最大的非噪声簇 cluster_ids, cluster_sizes np.unique(best_labels[best_labels!-1], return_countsTrue) if len(cluster_sizes) 0: main_cluster_id cluster_ids[np.argmax(cluster_sizes)] df_cluster df[df[cluster_label] main_cluster_id].copy() return df_cluster, best_params else: return None, best_params # 4. 计算星团参数 def calculate_cluster_parameters(df_cluster): 计算星团中心、共同自行和距离。 params {} params[center_ra] np.median(df_cluster[RA]) params[center_dec] np.median(df_cluster[DEC]) params[common_pmra] np.median(df_cluster[pmRA]) params[common_pmdec] np.median(df_cluster[pmDEC]) params[median_parallax] np.median(df_cluster[Plx]) params[distance_pc] 1.0 / (params[median_parallax] * 0.001) params[n_stars] len(df_cluster) return params # 主程序 def main(): # 配置参数 hipparcos_file path/to/your/hipparcos.fits # 替换为你的文件路径 hyades_center (65.0, 16.0) # (RA, DEC) in degrees search_radius 15.0 # degrees # 步骤1 2 print(步骤1 2: 加载并清洗数据...) df_region load_and_filter_data(hipparcos_file, *hyades_center, search_radius) df_clean clean_data(df_region, snr_threshold5) print(f 区域内存活恒星: {len(df_region)}) print(f 清洗后高质量恒星: {len(df_clean)}) # 步骤3 print(\n步骤3: 执行DBSCAN聚类寻找毕星团...) features_for_clustering [pmRA, pmDEC, Plx] df_hyades, best_params find_hyades_cluster(df_clean, features_for_clustering) if df_hyades is not None: print(f 最佳参数: eps{best_params[eps]}, min_samples{best_params[min_samples]}) print(f 识别出候选成员星: {len(df_hyades)} 颗) # 步骤4 print(\n步骤4: 计算星团参数...) results calculate_cluster_parameters(df_hyades) print(\n 求解结果 ) print(f星团中心 (RA, DEC): ({results[center_ra]:.3f}°, {results[center_dec]:.3f}°)) print(f 换算为时角制: ({results[center_ra]/15.0:.2f}h, {results[center_dec]:.2f}°)) print(f共同自行 (pmRA, pmDEC): ({results[common_pmra]:.2f}, {results[common_pmdec]:.2f}) mas/yr) print(f平均视差: {results[median_parallax]:.2f} mas) print(f估算距离: {results[distance_pc]:.2f} pc) print(f成员星数量: {results[n_stars]}) # (可选) 步骤5: 可视化与验证 # plot_clusters(df_clean, features_for_clustering, df_hyades) # plot_hr_diagram(df_hyades) else: print( 未能识别出显著的星团请调整聚类参数或数据筛选条件。) if __name__ __main__: main()6.1 关键技巧与避坑指南回顾整个项目有几个点特别值得分享这些是单纯看教程或文档很难体会到的数据信噪比阈值的选择Plx / e_Plx 5这个阈值不是绝对的。如果设得太高比如10可能会剔除掉很多真实的、但测量精度稍差的成员星导致样本量不足。如果设得太低比如2则会引入大量噪声干扰聚类。建议从5开始尝试根据聚类结果的“干净程度”赫罗图的集中度微调。DBSCAN参数的经验起点对于Z-score标准化后的三维数据pmRA, pmDEC, Plxeps的初始尝试值可以设在0.3到0.5之间。这大致对应原始空间中自行约15-25 mas/yr、视差约3-5 mas的邻域范围与毕星团内部速度弥散和距离弥散的量级相符。min_samples可以设为预期最小成员星数量的一个分数比如10-15。“先聚类后定心”的逻辑一定要坚持先通过运动学特征自行、视差把成员星筛选出来再计算它们的空间位置中心。如果反过来先根据位置选一个区域内的所有星来计算平均自行结果一定会被大量的背景场星带偏因为场星在数量上往往占优。可视化是调试的最佳伙伴不要只盯着最终的数字结果。多画图原始数据的分布、聚类结果的散点图、赫罗图。图形能直观地告诉你聚类是否有效、成员星样本是否物理解释得通。当调整参数时图形的变化比数字的变化更能给你灵感。理解误差来源最终结果的误差不只来自计算。更大的误差可能来源于a) 依巴谷星表自身的测量误差b) 我们的成员星选择方法不可能100%纯净总会混入或漏掉一些星c) 星团本身并非一个无限小的点它有空间大小和速度弥散。因此将我们的结果与权威值比较时关注趋势和量级上的一致性而非小数点后的完美吻合。这个项目虽然源于一次数学建模竞赛但它完整地展示了一个数据驱动的科学发现流程从原始数据出发通过物理建模指导算法选择利用统计和机器学习工具提取信息最后通过物理诊断赫罗图验证结果。无论你未来是处理天文数据还是其他任何领域的复杂数据集这套“问题定义-数据预处理-特征工程-模型选择-求解验证”的思维框架都是极其宝贵的。
返回列表