首页
/ dotnet/machinelearning 表达式估算器深度解析

dotnet/machinelearning 表达式估算器深度解析

2025-07-06 07:40:58作者:晏闻田Solitary

表达式语言概述

dotnet/machinelearning 中的表达式估算器提供了一种功能强大的表达式语言,这种语言设计旨在让广大开发者感到熟悉且易于使用。它具有以下核心特性:

  • 类型安全:采用静态类型系统,所有类型由编译器自动推断
  • 函数式特性:纯函数式设计,不支持可变状态和副作用操作
  • 错误处理:没有异常机制,异常情况会返回 NA 值
  • 跨平台兼容:设计上考虑了不同平台和环境的兼容性

基础语法详解

表达式的基本结构由参数列表和表达式体组成,支持两种分隔方式:

// 冒号分隔
参数列表 : 表达式体

// 箭头函数分隔
参数列表 => 表达式体

参数列表可以是单个标识符,也可以是括号包裹的多个标识符:

x => x * 2
(a, b) => a + b

数据类型与字面量

布尔类型

  • 字面量:truefalse
  • 默认值: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"

最佳实践建议

  1. 性能优化:尽量使用多操作数比较而非多个&&连接

    // 推荐
    0 <= x < 10
    
    // 不推荐
    0 <= x && x < 10
    
  2. 类型安全:注意整数运算可能溢出产生NA

  3. 可读性:复杂计算使用with表达式分解步骤

  4. 错误处理:使用??运算符处理NA值

    x ?? default(x)
    
  5. 常量定义:重要常量使用with表达式定义,便于维护

表达式估算器为dotnet/machinelearning提供了强大的数据转换能力,掌握这些语法和函数可以极大提升特征工程和数据预处理的效率。