piecewiseLinFit
语法
piecewiseLinFit(X, Y, numSegments, [XC], [YC], [bounds],
[lapackDriver='gelsd'], [degree=1], [weights], [method='de'], [maxIter],
[initialGuess], [seed])
详情
通过给定数据点集和给定线段数,拟合一个连续的分段线性回归函数;并使用差分进化算法通过最小化平方误差之和,找到给定数量的线段断点的最优位置。
注意:由于差分进化算法的随机性,本函数每次运行结果会略有区别。
参数
X 数值向量,表示数据点的 x 坐标值。仅在 method='de' 时生效。注意:不可传入 NULL 值。
Y 数值向量,表示数据点的 y 坐标值。仅在 method='de' 时生效。注意:不可传入 NULL 值。
numSegments 正整数,表示用于拟合的线段数量。
XC 可选参数,数值向量,表示分段线性函数将被强制通过的数据点的 x 位置。
YC 可选参数,数值向量,表示分段线性函数将被强制通过的数据点的 y 位置。
bounds 可选参数,数值矩阵,表示在优化中每个断点位置的边界。形状为(numSegments - 1, 2),每一行为对应断点的边界。
lapackDriver 可选参数,字符串标量,表示使用具体的某个 LAPACK 程序来求解最小二乘问题。可选值为'gelsd', 'gelsy' 和 'gelss'。
degree 可选参数,非负整数标量,表示要使用的多项式的阶数。degree=1 表示使用线性模型;degree=0 表示使用常数模型。
weights可选参数,数值向量,表示加权最小二乘法中的权重。单个权重通常是每个数据点标准偏差的倒数,即 weights[i] 为第 i 个数据点标准差的倒数。注意:不可传入 NULL 值。
method 可选参数,字符串标量,表示在拟合过程中使用的最优化算法。可选值为:
-
“nm“:表示使用 Nelder-Mead 单纯形算法。
-
“bfgs“:表示使用 bfgs 算法。
-
“lbfgs“ :表示使用 lbfgs 算法。
-
'slsqp':表示顺序最小二乘编程方法(SLSQP)算法。
-
'de':表示差分进化(Differential Evolution)算法,默认值。
maxIter 可选参数,整型标量或向量,表示拟合过程中优化算法的最大迭代次数。
initialGuess 可选参数,数值向量,表示分段断点位置的初始猜测,长度为 numSegments - 1。
seed 可选参数,整数标量,表示差分进化算法中使用的随机数种子,仅在 method='de' 或 initialGuess 为空时生效。若 method='de' 或 initialGuess 为空,且不指定 seed,则采用非确定性的随机数生成器。seed 参数用于确保结果的可复现性。
返回值
返回一个字典,字典有以下成员:
-
breaks:浮点数向量,表示模型拟合后得到的线段断点位置。
-
beta:浮点数向量,表示模型拟合后的参数值。
-
xData:浮点数向量,表示输入的数据点的 x 坐标值。
-
yData:浮点数向量,表示输入的数据点的 y 坐标值。
-
XC:浮点数向量,表示分段线性函数将被强制通过的数据点的 x 位置。
-
YC:浮点数向量,表示分段线性函数将被强制通过的数据点的 y 位置。
-
weights:浮点数向量,表示加权最小二乘法中的权重。
-
degree:整数标量,表示要使用的多项式的阶数。
-
lapackDriver:字符串标量,表示使用的具体 LAPACK 程序来求解最小二乘问题。
-
numParameters:整数标量,表示模型的参数数量。
-
predict:模型的预测函数。其使用方法为
model.predict(X, [beta], [breaks])
,详情见 pwlfPredict。 -
modelName:表示模型类型,值为字符串”Piecewise Linear Regression”。
例子
本例自定义条件,传入参数 X, Y, numSegments,拟合一个连续的分段线性回归函数,并找到 3 个线段断点的最优位置。
def linspace(start, end, num, endpoint=true){
if(endpoint) return end$DOUBLE\(num-1), start + end$DOUBLE\(num-1)*0..(num-1)
else return start + end$DOUBLE\(num-1)*0..(num-1)
}
X = linspace(0.0, 1.0, 10)[1]
Y = [0.41703981, 0.80028691, 0.12593987, 0.58373723, 0.77572962, 0.41156172, 0.72300284, 0.32559528, 0.21812564, 0.41776427]
model = piecewiseLinFit(X, Y, 3)
model;
/* Output:
breaks->[0.0,0.258454644769,0.366954310101,1.000000000000]
numParameters->4
degree->1
xData->[0.0,0.111111111111,0.222222222222,0.333333333333,0.444444444444,0.555555555555,0.666666666666,0.777777777777,0.888888888888,1.000000000000]
predict->pwlfPredict
yData->[0.417039810000,0.800286910000,0.125939870000,0.583737230000,0.775729620000,0.411561720000,0.723002840000,0.325595280000,0.218125640000,0.417764270000]
yC->
xC->
weights->
beta->[0.593305500750,-1.309949743583,5.703647584013,-5.105351630664]
lapackDriver->gelsd
*/
承接上例,piecewiseLinFit
也可结合函数 pwlfPredict
使用。如下自定义参数,使用拟合后的连续分段线性回归模型来对输入的数据点进行预测。
xHat = linspace(0.0, 1.0, 20)[1]
model.predict(xHat)
/* Output:
[0.593305499919518 0.524360777381737 0.455416054843957 0.386471332306177 0.317526609768396 0.368043438179296 0.529813781212159 0.691584124245021 0.69295837868457 0.655502915538459 0.618047452392347 0.580591989246236 0.543136526100125 0.505681062954014 0.468225599807903 0.430770136661792 0.393314673515681 0.35585921036957 0.318403747223459 0.280948284077348]
*/
相关函数:pwlfPredict