人工智能入门实战:人工智能在天文的应用
1.背景介绍
天文
天文学作为一门科学,专门研究宇宙中天体的运行规律及其相互作用。它涵盖了太阳、月亮、地球、星空、银河系、海洋等物质,以及它们周围空间的运行规律,为人类探索宇宙奥秘、研究宇宙真相提供了重要工具。我们日常生活中,天文渗透到各个领域,几乎无处不在。例如,时钟、日历、航海、医学、机器人控制、互联网、金融、经济、房地产、制造业、广告、文化等领域,无一不与天文密切相关。
人工智能
人工智能(Artificial Intelligence)是由人或机械工程师通过观察世界、模拟实验、编程或学习的方式开发出的一种计算机智能。人工智能通过感知、理解和执行智能行为,以拓展对人的智慧、灵活性和自主性。一般而言,人工智能主要涉及三个方面:机器智能、人工智能与计算理论,以及复杂系统与计算模式。目前,人工智能已在多个领域发挥基础作用,包括图像识别、语言处理、语音识别、垃圾邮件过滤、广告推送、推荐引擎、医疗诊断、自动驾驶、金融风险分析、语义搜索、数据挖掘和云计算。
目标与难点
本实战教程专为希望深入探索人工智能技术的读者设计,旨在通过实际操作环节帮助读者掌握人工智能在天文学中的应用。
为了达到这一目标,我们需要解决以下几个主要难点:
- 缺乏广博的天文知识储备;
- 缺乏坚实的数学功底;
- 缺乏丰富的实际案例和实践经验;
- 不擅长将模型结果转化为实际应用中使用的问题。
因此,通过本实战教程,我们希望能帮助读者:
- 对天文领域有深入的了解和全面的把握;
- 具备熟练掌握并灵活运用人工智能技术的能力;
- 能够将理论知识与实际经验相结合,为自己构建更完善的建模思路。
2.核心概念与联系
数据集
天文数据集包含天文学领域的各种原始观测数据。常用的类型包括光谱数据、光谱能量分布图数据、合成回归函数数据以及天体模型数据等。由于数据量较大,通常会采用专门的管理系统进行存储和归档。
本实战教程所采用的天文数据集是基于天文现象处处于高精度状态下的光谱数据生成。光谱数据作为表征天文现象的实验性数据形式,由不同波长光子的计数结果构成。光谱数据的形成需要极高的精确度,因此在高精度状态下进行的天文观测所得的光谱数据被统称为高光谱数据。
特征提取
特征提取是通过从原始数据中提取有用信息来完成的任务。特征既可以表示某些物理参数的数值,也可以表示某些统计量。通过提取特征,我们可以更有效地表示天文现象,并据此进行分类、预测、识别和监控。
在本实战教程中,本实战教程将采用ANN作为特征提取方法。ANN是一种基于连接的结构,同时具有多层次结构、递归算法和自学习能力的神经网络模型,具备进行特征提取的能力。
模型训练与评估
模型训练及评估过程是机器学习中不可或缺的重要环节。模型训练即通过训练模型来对输入数据进行预测或分类。评估模型性能的指标主要包括准确率(Accuracy)、召回率(Recall)、F1分数、AUC值等。通过多维度指标的比较,我们可以评估模型的性能。
在本实战教程中,本教程将采用交叉验证法(Cross Validation,CV)对模型进行训练。CV 是评估机器学习模型性能的一种方法。该方法通过将数据集划分为多个子集,分别在每个子集上训练模型,最后对所有子集的测试结果进行平均。
3.核心算法原理和具体操作步骤以及数学模型公式详细讲解
准备数据
在获取数据之前,我们需要收集相关数据集,其中涉及光谱数据以及对应的天文参数信息。一般情况下,光谱数据可以从多个天文数据中心获取,也可以从开放获取的数据资源中下载。
数据预处理
数据预处理是指对原始数据进行清洗和优化、转换和归一化处理、标准化处理以及剔除异常数据点的过程。这一过程的主要目标是去除数据集中的噪声、缺失值、重复数据以及杂质,从而使得数据集更加干净、完整和高质量。
对于光谱数据来说,一般会有以下几种预处理方式:
-
分辨率优化:通过优化光谱数据的分辨率,减少数据的采样频率,实现更高分辨率的光谱数据。
-
光谱平滑:通过对光谱数据进行平滑处理,消除光谱数据中的噪声影响;
光谱标准化处理:通过归一化处理光谱数据,确保所有波段的光谱曲线具有相同的尺度特征;
测试/训练集划分:将数据集分为测试集和训练集,其中训练集用于训练模型,测试集则用于评估模型的性能。
特征工程
特征工程化具体表现为从原始数据中系统性地从原始数据中提取具有判别性的特征进行模型构建。这里的特征涵盖多种多样的参数组合,包括星体的颜色、形状、大小、位置等关键指标。
特征工程的具体工作包括:
选择合适的特征指标:选择合适的特征指标能够体现模型对待测对象在分类、预测等任务所需的关键属性。不同特征指标对模型性能的影响各有差异。
-
特征预处理:对特征进行预处理,如标准化、归一化等,以便于模型训练。
-
创建新特征:基于现有特征,开发新的特征,例如,对两个特征之间的关系进行建模分析;
-
特征选择:筛选掉冗余或不重要的特征,减少特征数量,防止过拟合。
ANN模型
ANN(Artificial Neural Network,人工神经网络)由多个人工神经元构成网络结构。该技术在机器学习领域展现出显著的应用潜力,能够有效处理复杂的分类、预测以及聚类等多种任务。
多层感知器
ANN的核心组件被称为多层感知机,缩写为MLP。它是一种典型的两层神经网络结构,在MLP结构中,第一层是输入层,第二层是输出层。该网络通过线性加权输入信号并进行非线性处理,从而实现输出结果的生成。
基于输入数据x,MLP通过一系列非线性变换逐步转换输入数据,最终生成输出y。形式上可以表示为:
y = f(W*x+b)
其中,W 和 b 为模型的参数。其中 W 代表连接权重,b 代表偏置项。
MLP的训练过程是通过在数据集上进行训练,不断迭代更新模型参数,使得其输出 y_hat 与真实值之间的误差最小化。经过训练后,该模型能够对新输入数据进行预测。
隐藏层的个数
在ANN模型中,隐藏层的数量是一个非常重要的超参数设置。增加隐藏层的数量,能够显著提升模型的表达能力,使其能够有效识别、预测和聚类各类复杂输入数据。然而,增加隐藏层数量的同时,也可能带来模型复杂度过高的问题,从而导致过拟合或欠拟合现象。
激励函数的选择
激活函数是指在每一层神经元的输出上引入非线性变换的函数。在 MLP 中,常用的激活函数包括 Sigmoid 函数、ReLU 函数以及 Tanh 函数等。
S-shaped sigmoid function operates within the interval [0, 1], maintaining an average value of 0.5. This characteristic facilitates uniform distribution of model outputs within the defined range. However, it is prone to gradient vanishing or explosion issues. In contrast, the ReLU function exhibits an S-shaped curve, spanning from (0, ∞), with an average value of 0 in the negative domain, offering a distinct advantage by mitigating gradient vanishing or explosion. The Tanh function, also characterized by its S-shaped curve, features an average value of 0. Notably, its relatively lower average compared to other activation functions helps suppress overfitting tendencies.
Batch Normalization
Batch Normalization 是一种正则化技术,通过对其中间层的输出进行标准化处理。这种处理方式能够有效抑制梯度消失和爆炸的问题。其主要目标是使网络每一层的输入数据分布趋于一致,输出数据呈现零均值和单位方差的特性。
BN 可以通过下面三步来实现:
在每次迭代开始时,对输入数据进行归一化处理,确保每个数据点的输入均值为0,标准差为1;
通过将归一化处理后的输入数据传递至下一层,再对下一层输出结果进行标准化处理,从而确保输出数据的均值为0,标准差为1。
- 将标准化后的结果添加到激励函数的输入中,实现 BN 操作。
模型训练
模型训练的流程如下:
- 为模型参数赋初值;
- 系统按顺序遍历训练数据集,随机选取一个样本输入模型,生成预测值 y_hat;
- 系统通过参数更新机制,使模型预测值 y_hat 更趋近于真实值;
- 系统检测模型是否收敛,若未达到收敛条件,则返回步骤 2;
- 系统对模型性能进行评估,计算并记录分类错误率和准确率等指标;
- 系统返回步骤 2继续训练,直至模型收敛或达到最大迭代次数;
超参数调优
超参数是模型训练过程中需要配置的变量,涉及学习率、权重衰减、批量大小以及隐藏层个数等多个关键因素。参数优化的目标是确定能够使模型性能达到最佳水平的参数组合。
在本实战教程中,我们将利用 GridSearchCV 进行超参数优化。GridSearchCV 是 Scikit-learn 提供的一个用于超参数调优的工具。该工具的功能是通过遍历指定的参数集合,在训练数据上反复训练模型,以确定最优的超参数配置。
4.具体代码实例和详细解释说明
数据准备
本实战教程所使用的光谱数据集来源于Gamma射电望远镜的光谱仪捕获过程。该数据集具有高分辨率的特征,具有训练与验证模型性能的重要价值。
import numpy as np
from sklearn.datasets import fetch_california_housing
# 获取数据
data = fetch_california_housing()
X, y = data['data'], data['target']
print("Data shape:", X.shape)
print("Label shape:", y.shape)
代码解读
数据预处理
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
# 拆分数据集为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 对数据进行标准化
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)
print("Training set shape:", X_train.shape)
print("Test set shape:", X_test.shape)
代码解读
特征工程
我们将对光谱数据进行预处理,然后将其展开为 2D 数组。
def flatten_spectra(X):
n_samples = len(X)
n_freqs = int((X[0].shape[-1]-1)/2) # 共计142个频率
spectra_dim = n_freqs * 2 + 1 # 每条光谱的维度为38,共计762维
flat_X = np.empty((n_samples, spectra_dim))
for i in range(len(X)):
freqs = X[i][:, :-1] # 频率范围为1-933 GHz,共计142个
intensities = X[i][:, -1]
spectrum = []
for j in range(n_freqs):
idx = np.argmax(intensities[:j]) # 找出能量最高的波段
if idx < n_freqs:
energy1 = intensities[idx] # 当前能量
width1 = abs(idx - np.argmin(intensities[idx:])) # 能量最高的波段左侧的宽度
width2 = abs(np.argmin(intensities[idx:]) - idx) # 右侧的宽度
delta_energy = energy1 / (width1 + width2) # 能量跨越的距离
left_idx = max(idx - round(delta_energy), 0) # 左侧的能量最高的波段
right_idx = min(idx + round(delta_energy)+1, n_freqs) # 右侧的能量最高的波段
row = np.concatenate([freqs[left_idx:right_idx], [width1, width2]])
else:
continue
spectrum += list(row)
flat_X[i,:] = spectrum
return flat_X
代码解读
ANN模型
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Dropout
# 构造ANN模型
model = Sequential()
model.add(Dense(64, activation='relu', input_dim=762))
model.add(Dropout(0.5))
model.add(Dense(1))
# 设置模型参数
model.compile(loss='mean_squared_error', optimizer='adam')
# 训练模型
history = model.fit(X_train, y_train, epochs=100, batch_size=32, verbose=True, validation_split=0.2)
代码解读
超参数调优
from tensorflow.keras.wrappers.scikit_learn import KerasRegressor
from sklearn.model_selection import GridSearchCV
# 创建一个KerasRegressor对象
regressor = KerasRegressor(build_fn=create_model, epochs=100, batch_size=32, verbose=0)
# 设置要调优的参数范围
param_grid = {'dense_layer1': [4, 8, 16],
'dropout': [0., 0.1, 0.2]}
# 使用GridSearchCV进行超参数调优
gridsearch = GridSearchCV(estimator=regressor, param_grid=param_grid, cv=5, n_jobs=-1)
gridsearch.fit(X_train, y_train)
# 查看最佳的参数组合
best_params = gridsearch.best_params_
print("Best params:", best_params)
代码解读
