dotnet/machinelearning 表达式估算器深度解析
2025-07-06 07:40:58作者:晏闻田Solitary
表达式语言概述
dotnet/machinelearning 中的表达式估算器提供了一种功能强大的表达式语言,这种语言设计旨在让广大开发者感到熟悉且易于使用。它具有以下核心特性:
- 类型安全:采用静态类型系统,所有类型由编译器自动推断
- 函数式特性:纯函数式设计,不支持可变状态和副作用操作
- 错误处理:没有异常机制,异常情况会返回 NA 值
- 跨平台兼容:设计上考虑了不同平台和环境的兼容性
基础语法详解
表达式的基本结构由参数列表和表达式体组成,支持两种分隔方式:
// 冒号分隔
参数列表 : 表达式体
// 箭头函数分隔
参数列表 => 表达式体
参数列表可以是单个标识符,也可以是括号包裹的多个标识符:
x => x * 2
(a, b) => a + b
数据类型与字面量
布尔类型
- 字面量:
true
和false
- 默认值:
false
整数类型
- 十进制表示:
12345
- 十六进制表示:
0x1234ABCD
- 类型后缀:
u/U
:无符号整数l/L
:长整型(Int64)
浮点类型
- 标准表示法:
3.14159
- 科学计数法:
6.022e23
- 类型后缀:
f/F
:单精度浮点d/D
:双精度浮点
- 默认精度:单精度(与C#不同)
文本类型
- 双引号包裹:
"Hello World"
- 支持标准转义字符:
\n
,\t
等
运算符全解析
条件运算符
condition ? true_value : false_value
- 条件必须为布尔类型
- 两个值分支必须类型兼容
合并运算符
x ?? y
- 右结合性
- 操作数必须同为Single或Double
逻辑运算符
||
/or
:逻辑或&&
/and
:逻辑与
比较运算符
支持多操作数比较:
// 等价于 a == b && b == c
a == b == c
// 等价于 0 <= x && x < 10
0 <= x < 10
数学运算符
- 基本运算:
+
,-
,*
,/
,%
- 幂运算:
^
(右结合性) - 一元运算符:
-
(负号),!
/not
(逻辑非)
With表达式高级用法
With表达式允许定义局部变量,提高复杂表达式的可读性和性能:
// 基本形式
with(变量定义列表; 结果表达式)
// 温度转换示例
c => with(
f = c * 9 / 5 + 32;
f < 60 ? "太冷!" : f > 90 ? "太热!" : "正好!"
)
// 变量间引用
c => with(
f = c * 9 / 5 + 32,
cold = f < 60,
hot = f > 90;
-float(cold) + float(hot)
)
// 复杂常量计算
ticks => with(
ticksPerSecond = 10000000L,
ticksPerHour = ticksPerSecond * 3600,
ticksPerDay = ticksPerHour * 24,
day = ticks / ticksPerDay,
dayEpoch = 1;
(day + dayEpoch) % 7
)
函数库详解
通用函数
函数 | 描述 | 示例 |
---|---|---|
isna(x) |
检查是否为NA | isna(null) → true |
na(x) |
返回x类型的NA值 | na(0) → float.NaN |
default(x) |
返回x类型的默认值 | default(0) → 0 |
类型转换函数
bool(x) // 转换为布尔值
int(x) // 转换为Int32
long(x) // 转换为Int64
float(x) // 转换为Single
double(x) // 转换为Double
text(x) // 转换为字符串
数学函数
- 基础运算:
abs
,sign
- 极值函数:
min
,max
- 舍入函数:
trunc
,floor
,ceil
,round
- 对数指数:
exp
,log
/ln
- 三角函数:
sin
/sind
(弧度/角度)cos
/cosd
tan
/tand
- 反函数:
asin
,acos
,atan
- 双曲函数:
sinh
,cosh
,tanh
- 角度转换:
deg
/degrees
,rad
/radians
文本处理函数
len("abc") → 3
lower("ABC") → "abc"
left("hello", 2) → "he"
right("hello", -2) → "llo"
mid("hello", 1, 3) → "ell"
concat("a","b","c") → "abc"
最佳实践建议
-
性能优化:尽量使用多操作数比较而非多个&&连接
// 推荐 0 <= x < 10 // 不推荐 0 <= x && x < 10
-
类型安全:注意整数运算可能溢出产生NA
-
可读性:复杂计算使用with表达式分解步骤
-
错误处理:使用??运算符处理NA值
x ?? default(x)
-
常量定义:重要常量使用with表达式定义,便于维护
表达式估算器为dotnet/machinelearning提供了强大的数据转换能力,掌握这些语法和函数可以极大提升特征工程和数据预处理的效率。