机器学习
Valkyrie 为机器学习提供了基于 Array 和 ArrayND 的高效数值计算支持,专注于实用的机器学习算法和数据处理。
相关示例
- 网络爬虫 - 用于数据收集的高性能异步爬虫框架
核心数组类型
Array1D- 一维数组,用于向量和特征处理ArrayND- 多维数组,用于矩阵运算和批量数据处理- 内置异构计算支持,可在 CPU/GPU 间无缝切换
数据处理
基本数据操作
valkyrie
# 创建和加载数据
let features = ArrayND::from_csv("data/features.csv") # 特征矩阵
let labels = Array1D::from_csv("data/labels.csv") # 标签向量
# 数据预处理
let normalized = features.normalize() # 标准化
let centered = features - features.mean(axis=0) # 中心化
# 数据分割
let (X_train, X_test, y_train, y_test) = train_test_split(
features, labels, test_size=0.2, random_state=42
)特征工程
valkyrie
# 特征缩放
let scaled_features = features.standardize() # 标准化 (z-score)
let normalized_features = features.normalize(min=0.0, max=1.0) # 归一化
# 特征选择
let selected = features.select_by_variance(threshold=0.01)
let top_features = features.select_k_best(k=10, target=labels)
# 特征变换
let polynomial = features.polynomial_features(degree=2)
let log_transformed = features.log_transform()机器学习算法
线性模型
valkyrie
# 线性回归 - 使用矩阵运算
let 𝐗 = X_train.add_bias_column() # 添加偏置列
let 𝐰 = (𝐗ᵀ · 𝐗)⁻¹ · 𝐗ᵀ · y_train # 最小二乘解
let predictions = X_test.add_bias_column() · 𝐰
# 岭回归 - 带正则化
let λ = 0.1
let 𝐈 = ArrayND::eye(𝐗.shape()[1])
let 𝐰_ridge = (𝐗ᵀ · 𝐗 + λ * 𝐈)⁻¹ · 𝐗ᵀ · y_train
# 逻辑回归 - sigmoid激活
let σ = |z: ArrayND| 1.0 / (1.0 + (-z).exp()) # sigmoid函数
let logits = X_test · 𝐰
let probabilities = σ(logits)聚类算法
valkyrie
# K-Means 聚类 - 使用数组操作
let k = 3
let centroids = ArrayND::random([k, X_train.shape()[1]]) # 随机初始化质心
for iteration in 0..100 {
# 计算距离矩阵
let distances = X_train.cdist(centroids) # [n_samples, k]
let assignments = distances.argmin(axis=1) # 最近质心索引
# 更新质心
for cluster in 0..k {
let mask = assignments.eq(cluster)
let cluster_points = X_train.masked_select(mask)
if cluster_points.shape()[0] > 0 {
centroids.row_mut(cluster).copy_from(cluster_points.mean(axis=0))
}
}
}K-Means 聚类
valkyrie
# K-Means 聚类 - 使用数组操作
let k = 3
let centroids = ArrayND::random([k, X_train.shape()[1]]) # 随机初始化质心
for iteration in 0..100 {
# 计算距离矩阵
let distances = X_train.cdist(centroids) # [n_samples, k]
let assignments = distances.argmin(axis=1) # 最近质心索引
# 更新质心
for cluster in 0..k {
let mask = assignments.eq(cluster)
let cluster_points = X_train.masked_select(mask)
if cluster_points.shape()[0] > 0 {
centroids.row_mut(cluster).copy_from(cluster_points.mean(axis=0))
}
}
}降维算法
valkyrie
# 主成分分析 (PCA) - 使用矩阵分解
let 𝐗_centered = X_train - μ # 中心化,μ = X_train.mean(axis=0)
let Σ = 𝐗_centeredᵀ · 𝐗_centered / (X_train.shape()[0] - 1) # 协方差矩阵
let (λ, 𝐕) = Σ.eig() # 特征分解:λ为特征值,𝐕为特征向量
# 选择前k个主成分
let k = 2
let 𝐕_k = 𝐕.slice([.., 0..k]) # 前k个特征向量
let 𝐗_pca = 𝐗_centered · 𝐕_k # 投影到主成分空间模型评估
valkyrie
# 基本评估指标 - 使用数组计算
let correct = y_true.eq(y_pred).sum() # 正确预测数量
let accuracy = correct.to_f64() / y_true.len() as f64
# 回归指标
let ε = y_true - y_pred # 残差
let MSE = (ε² ).mean() # 均方误差
let MAE = |ε|.mean() # 平均绝对误差
let RMSE = √MSE # 均方根误差数组操作示例
valkyrie
# 数据分割 - 使用数组索引
let n_samples = X.shape()[0]
let train_size = (n_samples as f64 * 0.8) as usize
let indices = ArrayND::arange(n_samples).shuffle() # 随机打乱索引
let train_indices = indices.slice([0..train_size])
let test_indices = indices.slice([train_size..])
let X_train = X.index_select(train_indices, axis=0)
let X_test = X.index_select(test_indices, axis=0)
let y_train = y.index_select(train_indices, axis=0)
let y_test = y.index_select(test_indices, axis=0) # 当缓冲区满时进行批量更新
总结
本文档展示了如何使用 Valkyrie 的 Array 和 ArrayND 类型进行机器学习任务。重点关注数组操作的实际使用,包括:
- 数据预处理和特征工程
- 基本机器学习算法的数组实现
- 聚类和降维的矩阵运算
- 模型评估的数组计算
- 数据分割和索引操作
通过这些示例,您可以了解如何利用 Valkyrie 的内置数组功能来构建机器学习应用。 for (name, (mean, std)) in results { @println("{}: {:.3} (+/- {:.3})", name, mean, std * 2) }
### 3. 特征工程自动化
```valkyrie
# 自动特征工程
let feature_engineer = AutoFeatureEngineering::new()
.polynomial_features(degree: 2)
.interaction_features(true)
.log_transform(columns: vec!["income", "age"])
.binning(column: "age", bins: 5)
let engineered_features = feature_engineer.fit_transform(X)Valkyrie 的机器学习特性提供了完整的工具链,从数据预处理到模型部署,支持传统机器学习和现代深度学习方法,为数据科学家和机器学习工程师提供了强大而灵活的开发环境。