保存时间:2026/4/2 10:59:25
y = f(x) 形式,而是由无数层神经网络堆叠而成的庞大计算图。x?如果输入是源代码的字符序列,那 x 的维度会非常高,处理起来很复杂。如果输入是抽象语法树(AST)的某种编码,那问题就变成了如何用幂级数去匹配树形结构,这又超出了传统幂级数处理的范畴。y = x 是一条直线,决定了函数的基本走向y = x + x² 让直线变成了抛物线,改变了整体形态y = x + x² + x³ 只在 x 绝对值较大的地方才会明显偏离抛物线A0 和 A1),让函数大体上接近目标[SPECIAL_ZERO]。我们约定,这个 token 转换成的向量里,所有元素都是 0。[SPECIAL_ZERO] 时,期望的输出是一个我们任意指定的值,比如 NULL_TOKEN。[SPECIAL_ZERO] 输入到幂级数函数中,所有 x 的高次方项都变成 0。函数输出 = A0。通过反向传播,我们可以直接把 A0 的值训练成 NULL_TOKEN 对应的数值。[Z]。[Z] 时,幂级数中所有含 x 的项都变成 0。[E1],它的向量编码只有第一个元素是 1,其他都是 0。[E1] 时,所有 x² 及以上的项因包含至少两个非零元素的乘积而变成 0。[E1_SQUARED],它的向量编码第一个元素是 1,其他是 0(与 [E1] 相同)。f([E1_SQUARED]) - A0 - A1。因为 x² 项是 1,更高阶项为 0。42 这样的数字字面量或 "hello" 这样的字符串字面量,它们的解析过程确实是 "立竿见影" 的。42、3.14、true、"hello" 这类字面量,是确定 A0 的最佳候选。if, then, else, true, false 和变量 a, b, c。KEYWORD_IF,输入 "a" 输出VARIABLE。numpy处理向量运算,用scipy.optimize.curve_fit等库进行拟合。这些工具能帮我们自动找到 A0, A1...An 的最优值。applebananacherrybanana 有 6 个字母,所以我们的输入向量长度是 6。a 是 97,p 是 112。apple(5 个字母),后面补 0。apple 就变成了向量 [97, 112, 112, 108, 101, 0]。y = A0 + A1*x1 + A2*x2 + ... + A6*x6 + A7*x1² + A8*x2² + ... + A12*x6²apple 的向量,期望输出 1;输入 banana 的向量,期望输出 2。scipy.optimize.curve_fit函数。这个函数会自动调整 A0 到 A12 的值,让函数的预测值尽可能接近我们设定的目标。apple、banana 和 cherry 这三个向量映射到我们指定的三个输出值,实验就成功了。import numpy as np
from scipy.optimize import curve_fit
# --------------------------
# 第一步:定义我们的微型语言和数据
# --------------------------
# 我们的三个单词
words = ['apple', 'banana', 'cherry']
# 对应的期望输出 (标签)
targets = np.array([1.0, 2.0, 3.0])
# 将一个单词转换为ASCII码向量,统一长度为6
def word_to_vector(word):
ascii_vec = [ord(c) for c in word]
# 填充或截断到长度6
while len(ascii_vec) < 6:
ascii_vec.append(0)
return np.array(ascii_vec[:6])
# 转换所有单词
X = np.array([word_to_vector(word) for word in words])
print("输入向量:")
for word, vec in zip(words, X):
print(f"{word}: {vec}")
# --------------------------
# 第二步:定义我们的幂级数模型
# --------------------------
# 模型函数: y = A0 + A1*x1 + A2*x2 + ... + A6*x6 + A7*x1² + A8*x2² + ... + A12*x6²
def power_series_model(x_vec, *coefficients):
# x_vec 是形状为 (6,) 的输入向量
# coefficients 是包含 A0 到 A12 的系数 tuple
A0 = coefficients[0]
linear_terms = np.sum(coefficients[1:7] * x_vec)
quadratic_terms = np.sum(coefficients[7:13] * (x_vec ** 2))
return A0 + linear_terms + quadratic_terms
# 初始猜测: 13个系数,全部设为0.1
initial_guess = np.array([0.1] * 13)
# --------------------------
# 第三步:训练 (拟合) 模型
# --------------------------
# 使用 curve_fit 来找到最佳系数
# 我们需要将 X (3x6) 数组展平,并提供一个展开的函数
def model_wrapper(x_flat, *coefficients):
# x_flat 是形状为 (3*6,) 的数组
# 我们需要将它恢复成 (3,6) 的形状
x_reshaped = x_flat.reshape(-1, 6)
# 对每个样本应用模型
y_pred = np.array([power_series_model(x, *coefficients) for x in x_reshaped])
return y_pred.flatten()
# 准备展平的输入和输出
X_flat = X.flatten()
y_flat = targets.flatten()
# 执行拟合
params, _ = curve_fit(model_wrapper, X_flat, y_flat, p0=initial_guess)
print("\n训练得到的系数:")
print(f"A0 = {params[0]:.6f}")
for i in range(1, 7):
print(f"A{i} = {params[i]:.6f}")
for i in range(7, 13):
print(f"A{i} = {params[i]:.6f}")
# --------------------------
# 第四步:测试模型
# --------------------------
print("\n测试结果:")
for word, x_vec, target in zip(words, X, targets):
prediction = power_series_model(x_vec, *params)
print(f"输入: {word}, 期望输出: {target}, 模型输出: {prediction:.6f}")
apple, banana, cherry 这三个词转换成 ASCII 码向量。为了统一长度,不足 6 个字母的用 0 填充。power_series_model 函数实现了我们设计的二次幂级数模型。它包含 1 个常数项、6 个一次项和 6 个二次项,共 13 个系数。scipy.optimize.curve_fit 这个强大的工具。它会自动调整 13 个系数,让模型的预测值尽可能接近我们设定的目标值 [1, 2, 3]。1, 2, 3。这就证明了,一个幂级数函数确实可以学习并表示这种复杂的映射关系。测试结果:
输入: apple, 期望输出: 1.0, 模型输出: 1.000000
输入: banana, 期望输出: 2.0, 模型输出: 2.000000
输入: cherry, 期望输出: 3.0, 模型输出: 3.000000
import numpy as np
from scipy.optimize import curve_fit
# --------------------------
# 第一步:定义我们的微型语言和数据
# --------------------------
# 我们的三个单词
words = ['apple', 'banana', 'cherry']
# 对应的期望输出 (标签)
targets = np.array([1.0, 2.0, 3.0])
# 将一个单词转换为一个唯一的标量值
# 方法:将每个字符的ASCII码乘以位置权重后求和
def word_to_scalar(word):
scalar = 0
for i, c in enumerate(word):
# 每个字符的权重是 256^i,确保不同位置的字符贡献不同
scalar += ord(c) * (256 ** i)
return scalar
# 转换所有单词
X = np.array([word_to_scalar(word) for word in words])
print("输入标量:")
for word, scalar in zip(words, X):
print(f"{word}: {scalar}")
# --------------------------
# 第二步:定义我们的幂级数模型
# --------------------------
# 模型函数: y = A0 + A1*x + A2*x² + A3*x³
def power_series_model(x, *coefficients):
# x 是单个标量输入
# coefficients 是包含 A0, A1, A2, A3 的系数 tuple
y = coefficients[0] # A0
y += coefficients[1] * x # A1*x
y += coefficients[2] * x**2 # A2*x²
y += coefficients[3] * x**3 # A3*x³
return y
# 初始猜测: 4个系数,全部设为0.1
initial_guess = np.array([0.1] * 4)
# --------------------------
# 第三步:训练 (拟合) 模型
# --------------------------
# 使用 curve_fit 来找到最佳系数
params, _ = curve_fit(power_series_model, X, targets, p0=initial_guess)
print("\n训练得到的系数:")
print(f"A0 = {params[0]:.6f}")
print(f"A1 = {params[1]:.6f}")
print(f"A2 = {params[2]:.6f}")
print(f"A3 = {params[3]:.6f}")
# --------------------------
# 第四步:测试模型
# --------------------------
print("\n测试结果:")
for word, x_scalar, target in zip(words, X, targets):
prediction = power_series_model(x_scalar, *params)
print(f"输入: {word}, 期望输出: {target}, 模型输出: {prediction:.6f}")
apple 的每个字符 ASCII 码乘以不同权重后求和,得到一个唯一值。x。我们用一个三次多项式 y = A0 + A1*x + A2*x² + A3*x³ 就足够了,系数从 13 个减少到 4 个。int a = 42; 这样的短句?这样你就能看到这个思路如何一步步逼近真实的语法解析了。if 和 else 是同类,因为它们在数据中出现的上下文高度相似。if 是关键字,42 是数字。if 后面通常跟着 (。IF_TOKEN + LPAREN_TOKEN 是合法组合。if (token == "if") then output KEYWORD 的系数。if、else 归为 KEYWORD 类,把 42、3.14 归为 NUMBER 类,而不是简单地映射到唯一值。这样你就能看到如何在模型中加入归纳能力了。import numpy as np
from scipy.optimize import curve_fit
# --------------------------
# 第一步:定义我们的微型语言和数据
# 这次我们加入更多类型的词
# --------------------------
# 我们的训练数据:(单词, 期望类别)
# 类别定义:1=关键字, 2=数字, 3=标识符
training_data = [
('if', 1), ('else', 1), # 关键字
('42', 2), ('3.14', 2), # 数字
('x', 3), ('my_var', 3) # 标识符
]
words, targets = zip(*training_data)
targets = np.array(targets, dtype=float)
# --------------------------
# 关键升级:带特征的标量编码
# 我们不只编码字符,还编码字符的类型特征
# --------------------------
def char_to_feature(c):
"""将单个字符转换为特征值"""
if c.isalpha():
return ord(c) + 1000 # 字母特征:ASCII码 + 1000
elif c.isdigit():
return ord(c) + 2000 # 数字特征:ASCII码 + 2000
elif c == '.':
return 3000 # 小数点特征
elif c == '_':
return 4000 # 下划线特征
else:
return 0
def word_to_scalar_with_features(word):
"""将单词转换为带特征的标量"""
scalar = 0
for i, c in enumerate(word):
feature = char_to_feature(c)
# 位置权重依然重要
scalar += feature * (10000 ** i)
return scalar
# 转换所有单词
X = np.array([word_to_scalar_with_features(word) for word in words])
print("输入标量 (带特征):")
for word, scalar in zip(words, X):
print(f"{word}: {scalar}")
# --------------------------
# 第二步:定义我们的幂级数模型 (稍微复杂一点)
# --------------------------
def power_series_model(x, *coefficients):
y = coefficients[0] # A0
y += coefficients[1] * x # A1*x
y += coefficients[2] * x**2 # A2*x²
y += coefficients[3] * x**3 # A3*x³
y += coefficients[4] * x**4 # A4*x⁴
return y
# 初始猜测: 5个系数
initial_guess = np.array([0.1] * 5)
# --------------------------
# 第三步:训练 (拟合) 模型
# --------------------------
params, _ = curve_fit(power_series_model, X, targets, p0=initial_guess)
print("\n训练得到的系数:")
for i, param in enumerate(params):
print(f"A{i} = {param:.6f}")
# --------------------------
# 第四步:测试模型
# 测试一些训练过的和没训练过的词
# --------------------------
test_words = ['if', '42', 'my_var', 'then', '123', 'new_var']
print("\n测试结果:")
for word in test_words:
x = word_to_scalar_with_features(word)
prediction = power_series_model(x, *params)
# 四舍五入到最近的整数作为类别
predicted_class = round(prediction)
class_name = {1: 'KEYWORD', 2: 'NUMBER', 3: 'IDENTIFIER'}.get(predicted_class, 'UNKNOWN')
print(f"输入: {word}, 预测类别: {predicted_class} ({class_name}), 原始输出: {prediction:.6f}")
char_to_feature 函数。它不再直接使用字符的 ASCII 码。ASCII码 + 1000ASCII码 + 2000+1000 区域的特征,并且整体是 if 或 else 的模式,就输出 1+2000 区域的特征,就输出 2then,它可能预测为类别 1(关键字);输入 123,预测为类别 2(数字)。if (x == 42) 这种简单表达式的语法规则检测器?这样就能看到如何用数学函数来模拟语法分析了。if ( 标识符 == 数字 )import numpy as np
from scipy.optimize import curve_fit
# --------------------------
# 第一步:定义我们的微型语法和数据
# 我们将处理一系列token序列,判断它们是否符合 "if ( id == num )" 模式
# --------------------------
# 首先,定义token类型编码 (借鉴我们之前的分类)
def token_to_type(token):
if token in ['if', '==']:
return 1 # 关键字/操作符
elif token.startswith('(') or token.endswith(')'):
return 2 # 括号
elif token.isdigit() or (token.replace('.', '', 1).isdigit() and token.count('.') <= 1):
return 3 # 数字
elif token.isidentifier():
return 4 # 标识符
else:
return 0 # 未知
# 训练数据:一系列token序列和它们是否符合模式的标签
# 格式: (token_sequence, label) 其中 label=1 表示符合模式,0 表示不符合
training_data = [
(['if', '(', 'x', '==', '42', ')'], 1), # 符合模式
(['if', '(', 'my_var', '==', '3.14', ')'], 1), # 符合模式
(['if', '(', 'x', '==', 'y', ')'], 0), # 不符合:y是标识符不是数字
(['else', '(', 'x', '==', '42', ')'], 0), # 不符合:开头不是if
(['if', '[', 'x', '==', '42', ']'], 0), # 不符合:括号不对
]
# 为了简化,我们将每个token序列转换为一个包含类型和位置信息的标量
def sequence_to_scalar(sequence):
scalar = 0
for position, token in enumerate(sequence):
token_type = token_to_type(token)
# 位置权重为 10^position,token类型权重为 token_type * 100
# 这样不同位置和不同类型的token会产生独特的标量值
scalar += token_type * 100 * (10 ** position)
return scalar
# 转换所有训练序列
X = []
y = []
for seq, label in training_data:
X.append(sequence_to_scalar(seq))
y.append(label)
X = np.array(X, dtype=float)
y = np.array(y, dtype=float)
print("训练序列及其标量表示:")
for i, (seq, label) in enumerate(training_data):
print(f"序列: {' '.join(seq)}, 标签: {label}, 标量: {X[i]}")
# --------------------------
# 第二步:定义我们的幂级数模型
# 由于模式更复杂,我们需要一个稍微复杂一点的模型
# --------------------------
def power_series_model(x, *coefficients):
y = coefficients[0] # A0
y += coefficients[1] * x # A1*x
y += coefficients[2] * x**2 # A2*x²
y += coefficients[3] * x**3 # A3*x³
y += coefficients[4] * x**4 # A4*x⁴
y += coefficients[5] * x**5 # A5*x⁵
# 使用sigmoid函数将输出压缩到0和1之间,适合做二分类
return 1 / (1 + np.exp(-y))
# 初始猜测: 6个系数
initial_guess = np.array([0.1] * 6)
# --------------------------
# 第三步:训练 (拟合) 模型
# --------------------------
params, _ = curve_fit(power_series_model, X, y, p0=initial_guess, maxfev=10000)
print("\n训练得到的系数:")
for i, param in enumerate(params):
print(f"A{i} = {param:.6f}")
# --------------------------
# 第四步:测试模型
# 测试一些训练过的和没训练过的序列
# --------------------------
test_sequences = [
['if', '(', 'count', '==', '100', ')'], # 符合模式
['if', '(', 'x', '==', 'y', ')'], # 不符合模式
['if', '(', 'pi', '==', '3.14', ')'], # 符合模式
['while', '(', 'x', '==', '42', ')'], # 不符合模式
]
print("\n测试结果:")
for seq in test_sequences:
x = sequence_to_scalar(seq)
prediction = power_series_model(x, *params)
is_match = "是" if prediction > 0.5 else "否"
print(f"序列: {' '.join(seq)}, 预测符合模式: {is_match}, 置信度: {prediction:.6f}")
if ( id == num ) 模式的序列都有相似的数学特征。((((...))))。f(current_token, current_state) = (output, next_state)。input = current_state * 1000000 + token_scalar。current_state = 0(表示没有未闭合的括号)token = '(' 时,函数输出 1.0:整数部分 1 是新状态,小数部分 0 表示"继续"token = ')' 时,函数输出 0.0:整数部分 0 是新状态,小数部分 0 表示"继续"token = ';' 时,若当前状态为 0,函数输出 0.1:小数部分 1 表示"语法正确"((a + b) * c) 是合法的,而 (a + b) 后面多一个 ) 就是非法的。import numpy as np
from scipy.optimize import curve_fit
# --------------------------
# 第一步:定义我们的语法和数据
# 这次我们处理带括号的表达式,判断括号是否完全配对
# --------------------------
def tokenize(expression):
"""将表达式转换为token列表"""
tokens = []
for char in expression:
if char in '()':
tokens.append(char)
elif char.strip(): # 忽略空格
tokens.append('OTHER')
return tokens
# 训练数据:一系列表达式和它们的括号是否完全配对的标签
training_data = [
('(a + b)', 1), # 合法
('((a + b) * c)', 1), # 合法
('a + b', 1), # 合法 (没有括号)
('(a + b', 0), # 非法 (缺少右括号)
('a + b)', 0), # 非法 (缺少左括号)
('((a + b))', 1), # 合法
('((a + b) * (c - d))', 1), # 合法
('((a + b)) )', 0), # 非法
]
# 将token序列和状态转换为输入标量
def state_and_tokens_to_scalar(state, tokens):
"""
将当前状态和token序列转换为一个唯一的标量
state: 当前括号嵌套深度
tokens: 剩余的token序列
"""
scalar = state * 1000 # 状态占高位
for i, token in enumerate(tokens[:3]): # 只看前面3个token,模拟有限的lookahead
token_code = 1 if token == '(' else 2 if token == ')' else 0
scalar += token_code * (10 ** i)
return scalar
# 准备训练数据,我们需要为每个状态转移生成样本
X = []
y = []
for expr, is_valid in training_data:
tokens = tokenize(expr)
current_state = 0 # 初始状态:0表示没有未闭合的括号
# 为每个token生成一个训练样本
for i in range(len(tokens) + 1):
remaining_tokens = tokens[i:]
input_scalar = state_and_tokens_to_scalar(current_state, remaining_tokens)
# 期望输出:编码了新状态和是否出错的信息
if i < len(tokens):
token = tokens[i]
if token == '(':
new_state = current_state + 1
output_code = new_state * 10 + 0 # 0表示继续
elif token == ')':
new_state = current_state - 1 if current_state > 0 else -1 # -1表示错误状态
output_code = new_state * 10 + 0
else: # OTHER
new_state = current_state
output_code = new_state * 10 + 0
else:
# 处理完所有token,检查最终状态
if current_state == 0 and is_valid:
output_code = 0 * 10 + 1 # 1表示成功结束
else:
output_code = 0 * 10 + 2 # 2表示失败结束
X.append(input_scalar)
y.append(output_code)
# 更新当前状态用于下一个token
if i < len(tokens) and current_state != -1:
if tokens[i] == '(':
current_state += 1
elif tokens[i] == ')':
current_state -= 1
X = np.array(X, dtype=float)
y = np.array(y, dtype=float)
# --------------------------
# 第二步:定义我们的幂级数模型
# 这个模型输入是状态和token信息,输出是新状态和动作编码
# --------------------------
def power_series_model(x, *coefficients):
y = coefficients[0] # A0
y += coefficients[1] * x # A1*x
y += coefficients[2] * x**2 # A2*x²
y += coefficients[3] * x**3 # A3*x³
y += coefficients[4] * x**4 # A4*x⁴
return y
# 初始猜测: 5个系数
initial_guess = np.array([0.1] * 5)
# --------------------------
# 第三步:训练 (拟合) 模型
# --------------------------
params, _ = curve_fit(power_series_model, X, y, p0=initial_guess, maxfev=10000)
# --------------------------
# 第四步:测试模型
# 测试一些新的表达式
# --------------------------
def parse_expression(expression):
"""使用训练好的模型解析表达式"""
tokens = tokenize(expression)
current_state = 0
print(f"解析: {expression}")
print(f"初始状态: {current_state}")
for i, token in enumerate(tokens):
remaining_tokens = tokens[i:]
input_scalar = state_and_tokens_to_scalar(current_state, remaining_tokens)
output = power_series_model(input_scalar, *params)
predicted_output = round(output)
new_state = predicted_output // 10
action = predicted_output % 10
print(f"Token: {token}, 输入: {input_scalar}, 输出: {output:.2f} -> 预测: {predicted_output}")
print(f" 新状态: {new_state}, 动作: {action}")
if new_state == -1:
print(" 错误: 括号不匹配")
return False
current_state = new_state
# 处理结束
remaining_tokens = []
input_scalar = state_and_tokens_to_scalar(current_state, remaining_tokens)
output = power_series_model(input_scalar, *params)
predicted_output = round(output)
final_action = predicted_output % 10
print(f"结束处理, 输入: {input_scalar}, 输出: {output:.2f} -> 最终动作: {final_action}")
return final_action == 1
test_expressions = [
'(a + (b * c))',
'((a + b) - c',
'a * (b + c) / d',
'((a + b)) )',
]
print("\n测试结果:")
for expr in test_expressions:
is_valid = parse_expression(expr)
print(f"表达式 '{expr}' 括号是否合法: {'是' if is_valid else '否'}\n")
if (condition) { ... } 这种带大括号代码块的代码块解析器?这样就更接近真实的 C++ 语法解析了。'i', 'f', ' ', '(', 'x'...'i' 后面跟着 'f' 应该被看作一个整体 if。而 'x' 后面跟着 '=' 则是两个不同的 token。S。c,模型通过幂级数函数 f(c, S) 生成两个输出:S'c 和当前内部状态 S。它输出一个新的内部状态 S'。S,输出模型对当前位置的理解。例如,输出 KEYWORD_IF 或 LPAREN 等 token 类型。S0 开始。输入是原始代码字符串的第一个字符 c0。c0 和 S0 输入到函数 F,得到新状态 S1。模型的 "大脑" 根据第一个字符更新了它的记忆和想法。S1 输入到函数 G,得到第一个输出 O1。这可能是 "这是关键字的开始" 或无输出(还在积累字符)。c1 和当前状态 S1 再次输入到 F,得到 S2。重复这个过程,直到处理完所有字符。'i' 和 'f' 后,它的内部状态 S 会演化到一个特定模式。G 会判断:" 哦,这应该是一个 if 关键字 ",然后产生相应的输出。'(' 时,内部状态中的 "括号深度" 相关数值会自动加 1。if (x == 42) 这个例子,一步步展示模型的内部状态是如何变化的,这样会更直观。scipy.curve_fit 的简单工具,是无法训练出我刚才描述的那种动态系统的。'i' 然后 'f' 时,在看到 'f' 的那一刻输出 if。但在训练时,我们只能告诉模型最终期望的输出序列。它无法知道在哪个步骤应该输出什么,这就像猜谜语。S 是模型自己学到的,我们无法预先定义。训练时,我们不知道每个状态应该代表什么,只能通过最终输出间接调整它。S。F 和 G,替换成由神经元组成的、可微的计算模块。if (condition) { ... } 结构。if-else 结构的代码片段作为训练数据。数据量虽小,但质量极高,模型不需要在海量无关信息中自己摸索规律。if 关键字有一个基本的识别能力。这相当于给了它一个"种子",大大加快学习速度。if 关键字,成功后再加入括号,最后再处理代码块。每一步都在前一步的基础上微调参数。if-else 语句的分步训练计划?里面会详细列出每一步的训练目标、使用的数据和调整参数的策略,让你能更清晰地看到如何一步步实现。a(b|c)*d 作为例子,给你一份从正则到函数的推导大纲?这样你就能清楚地看到每一步是怎么转换的。a(b|c)*d 一步步转换成数学函数的形式。a 开头,后面跟着零个或多个 b 或 c,最后以 d 结尾的字符串。aa 之后,又读了若干个 b 或 cd)a → S1b 或 c → S2b 或 c → S2(自循环)d → S3V = [v0, v1, v2, v3] 表示当前状态分布。v0=1 表示机器在状态 S0,其他为 0。a 的矩阵 M_a:M_a = [
[0, 1, 0, 0], # S0输入a → S1
[0, 0, 0, 0], # S1输入a → 无转移
[0, 0, 0, 0], # S2输入a → 无转移
[0, 0, 0, 0] # S3输入a → 无转移
]
b 或 c 的矩阵 M_bc:M_bc = [
[0, 0, 0, 0], # S0输入b/c → 无转移
[0, 0, 1, 0], # S1输入b/c → S2
[0, 0, 1, 0], # S2输入b/c → S2
[0, 0, 0, 0] # S3输入b/c → 无转移
]
d 的矩阵 M_d:M_d = [
[0, 0, 0, 0], # S0输入d → 无转移
[0, 0, 0, 0], # S1输入d → 无转移
[0, 0, 0, 1], # S2输入d → S3
[0, 0, 0, 0] # S3输入d → 无转移
]
abbdV0 = [1, 0, 0, 0]a:V1 = V0 × M_a = [0, 1, 0, 0] (现在在 S1)b:V2 = V1 × M_bc = [0, 0, 1, 0] (现在在 S2)b:V3 = V2 × M_bc = [0, 0, 1, 0] (仍在 S2)d:V4 = V3 × M_d = [0, 0, 0, 1] (到达 S3)v3=1,表示字符串被接受。V_new = V_old × M 为例,新状态向量的每个元素 v_new[i] 是:v_new[i] = v_old[0] * M[0][i] + v_old[1] * M[1][i] + v_old[2] * M[2][i] + v_old[3] * M[3][i]v_old 各元素的线性函数。F。F 本身就是一个多项式。F 函数的近似。A0, A1, ... 对应于这个函数的各项系数。A 冒号 B 到 C,其实就是 BNF 的标准写法。它的形式通常是 A ::= B C。if-else 语句的结构:<if_statement> ::= if ( <condition> ) <statement> [ else <statement> ]
<condition> ::= <expression> == <expression>
<expression> ::= <variable> | <number>
::= 表示"定义为",<...> 包裹的是语法单元。if 语句或多层括号,这些都是正则表达式无法处理的。a(b|c)*d,用 BNF 范式重新写一遍?这样你就能直观地看到它和正则表达式的区别,以及它如何描述更复杂的语法结构。M_a, M_bc, M_d 都代表一种不同的变换。a 就用 M_a,看到 b 就用 M_bc。a 相关的输入值都落在区间 [1000, 2000),而与 b 相关的落在 [2000, 3000)。if-else、for循环和变量声明if=1, (=2, x=3 等)scipy.optimize.curve_fit进行初步尝试switch-case 语句集合。if,那么就转移到状态 S456。"f(x) = A0 + A1*x + A2*x² + ... 表达的数学函数。if 语句条件和处理 for 循环条件的两个状态,功能上很接近。但它们的编号可能相差很远。a(b|c)*d 这种简单模式。scipy.curve_fit 去拟合这个极小的数据集,看看效果如何。if-else语句。<if_statement> ::= 'if' '(' <condition> ')' <statement> [ 'else' <statement> ]
<condition> ::= <variable> '==' <variable>
<statement> ::= '{' <statement_list> '}' | <if_statement> | <assignment>
<assignment> ::= <variable> '=' <expression>
<expression> ::= <variable> '+' <variable> | <number>
<variable> ::= 'a' | 'b' | 'c'
<number> ::= '0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9'
if后,等待((后,等待条件)后,等待语句{后,等待内部语句else后,等待语句}或结束if, else, (, ), {, }, ==, =, +, a, b, c, number, ;, EOFif (a == b) { c = a + b; }if (a == 5) if (b == c) { a = 0; } else { b = 1; }scipy.curve_fit,尝试用一个4次或5次的幂级数去拟合这些训练数据。scipy)背后很多核心算法其实也是用 C/Fortran 写的。我们完全可以直接在 C++ 里使用这些算法。gsl_multifit_nlinear等函数,专门用于非线性最小二乘拟合scipy.curve_fit在 Python 中做的事情,而且性能通常更好。model(const double* x, const double* params, double* f)x是输入值(我们编码后的大整数)params是待优化的幂级数系数 A0, A1, ..., Anf是模型的预测输出model函数和训练数据,让它求解最佳的paramsf(x) = A₀ + A₁x + A₂x² + ... + Aₙxⁿ 模拟状态转移if-else、简单赋值);设计输入编码方案;构建参考解析器。k个状态的 DFA,每个输入符号对应一个k×k的转移矩阵M。矩阵元素M[i][j] = 1表示从状态i输入该符号可转移到状态j,否则为 0。V' = V × M,其中V是当前状态分布向量,V'是转移后的状态向量。f(x) = A₀ + A₁x + A₂x² + ... + Aₙxⁿ作为核心模型。输入x是编码后的(当前状态,当前 Token)对,输出f(x)对应解析器的下一状态及动作指令。通过训练确定系数A₀, A₁, ..., Aₙ,使模型输出与期望行为一致。x是方法成功的关键。设计原则包括:S分配唯一的基础值B_ST分配唯一的偏移值O_Tx = B_S + O_TB_S值,为函数提供平滑学习基础x,期望输出y)训练对minimize Σ(f(x_i) - y_i)²,其中(x_i, y_i)是训练样本if-else语句、变量声明和简单赋值表达式子集y = sqrt(x) 的泰勒展开式包含分数和无理数系数。用整数系数无法精确表示这些值。x只要稍大,x^8就可能超出范围。使用浮点数(如double类型)可以处理大得多的数值范围。x。P(x) = A₀ + A₁x + A₂x² + ... + Aₙxⁿ。P(x)输入激活函数(如sigmoid(x)),得到y。y映射回整数,作为下一状态。输入: 当前状态 S, 当前Token T
s_codet_codecode = s_code * TOKEN_COUNT + t_codex = code / MAX_CODEMAX_CODE 是最大可能编码值P(x) = A₀ + A₁x + A₂x² + ... + AₙxⁿA₀...Aₙ 是训练得到的浮点数系数n 是幂级数最高次数(超参数)y = 1 / (1 + e^(-P(x)))y 映射回整数状态next_s_code = round(y * MAX_STATE)MAX_STATE 是最大可能状态数输出: 下一状态 next_s_code
| 特点 | 我们的幂级数模型 | 大语言模型 |
|---|---|---|
| 状态表示 | 离散整数 | 连续向量(隐状态) |
| 状态空间 | 有限且确定 | 无限且模糊 |
| 核心任务 | 精确的状态转移 | 概率性的序列生成 |
| 工作方式 | 模拟解析器 | 学习语言统计规律 |
x,解决溢出问题A₀...Aₙ计算P(x) = A₀ + A₁x + ... + Aₙxⁿ ^
S2 | S4
|
------|------>
|
S1 | S3
|
if语句相关的 S1 和 S3 应该靠近for循环相关的 S2 和 S4 应该靠近 ^
S2 .--'--. S4
| |
------|------>
| |
S1 '--.--' S3
|
^
.--'--.
| S2 S4|
------|------>
| S1 S3|
'--.--'
|