北京大兴企业网站建设咨询,河北省建设工程信息网招标公告,国内最炫酷的网站,用html做网站顺序目录#xff1a;缺失值处理和拉格朗日插值法一、前言二、理论知识三、代码实现一、前言
对于含有缺失值的数据集#xff0c;如果通过删除小部分记录达到既定的目标#xff0c;那么删除含有缺失值的记录的方法是最有效的。然而#xff0c;这种方法也有很多问题#xff0c;…
目录缺失值处理和拉格朗日插值法一、前言二、理论知识三、代码实现一、前言
对于含有缺失值的数据集如果通过删除小部分记录达到既定的目标那么删除含有缺失值的记录的方法是最有效的。然而这种方法也有很多问题删除缺失值的同时也会损失一定的信息对于那些数据集较小的来说这是影响很大的。
所以可以对这些缺失值进行填充。
最简单的处理原则
缺失值少于20%
连续变量使用均值或者中位数填补
分类变量不需要填补单算一类即可或者用众数填补。
缺失值在20%-80%
填补方法同上
另外每个有缺失值的变量生成一个指示哑变量参与后续的建模。
缺失值大于80%
每个有缺失值的变量生成一个指示哑变量参与后续的建模原始变量不使用。
也可以用最近邻插补法可以在数据集中寻找与该样本除掉缺失属性最相近的样本用相似的样本的属性值代替求相似度可以采用聚类方法。
其次还有回归方法和插值法回归方法及时建立回归模型用已有的数据训练模型然后再预测。
插值法就有朗日插值法和牛顿插值法这里就介绍一下拉格朗日插值法。
二、理论知识
下面是拉格朗日函数 f(x)∑i1i3yi∗∏i≠j1≤j≤3x−xjxi−xjf(x)\sum_{i1}^{i3}y_i * \prod_{i\neq j}^{1\leq j \leq 3}\frac{x-x_j}{x_i-x_j} f(x)i1∑i3yi∗ij∏1≤j≤3xi−xjx−xj 如何得到这个函数的分为下面几步
三个点(x1,y1),(x2,y2),(x3,y3)(x_1,y_1),(x_2,y_2),(x_3,y_3)(x1,y1),(x2,y2),(x3,y3)可以确定一条二次多项式的函数。这需要把三个点带入多项式然后解出各个系数。
但是拉格朗日的这个解法就不一样了。
第一步构建了一个函数 f1(x)(x−x2)(x−x3)(x1−x2)(x1−x3)f_1(x)\frac{(x-x_2)(x-x_3)}{(x_1-x_2)(x_1-x_3)} f1(x)(x1−x2)(x1−x3)(x−x2)(x−x3) 这个函数在xx1xx_1xx1时值为1xx2xx_2xx2时值为0xx3xx_3xx3时值为0。
同理分别构建 f2(x)(x−x1)(x−x3)(x2−x1)(x2−x3)f_2(x)\frac{(x-x_1)(x-x_3)}{(x_2-x_1)(x_2-x_3)} f2(x)(x2−x1)(x2−x3)(x−x1)(x−x3) 这个函数在xx2xx_2xx2时值为1xx1xx_1xx1和xx3xx_3xx3时值为0。 f3(x)(x−x1)(x−x2)(x3−x1)(x3−x2)f_3(x)\frac{(x-x_1)(x-x_2)}{(x_3-x_1)(x_3-x_2)} f3(x)(x3−x1)(x3−x2)(x−x1)(x−x2) 这个函数在xx3xx_3xx3时值为1在xx1xx_1xx1和xx2xx_2xx2时值为0。
那么f(x)f(x)f(x)就可以写为 f(x)y1f1(x)y2f2(x)y3f3(x)f(x)y_1f_1(x)y_2f_2(x)y_3f_3(x) f(x)y1f1(x)y2f2(x)y3f3(x)
写为 fi(x)∏i≠j1≤j≤3(x−xj)(xi−xj)f_i(x)\prod_{i\neq j}^{1\leq j \leq 3}\frac{(x-x_j)}{(x_i-x_j)} fi(x)ij∏1≤j≤3(xi−xj)(x−xj)
得到拉格朗日函数。
三、代码实现
from scipy.interpolate import lagrange
def lag_fill(df, i, k):r 0 if (i - k) 0 else (i - k)l len(df.index) if (i 1 k) len(df.index) else (i 1 k)y df.loc[list(range(r, i)) list(range(i 1, l))]for j in y.index:if y.isnull().loc[j]:y.drop(index j, inplace True)x y.indexlag lagrange(x.values, y.values)return lag(i)index np.array(data[Age][data[Age].isnull()].index)
nums []
for i in index:num int(lag_fill(data[Age], i, 5))nums.append(num)df data[Age].copy()
index np.array(df[df.isnull()].index) # 缺失值的索引
for i in range(len(index)):df.loc[index[i]] nums[i]
df.isnull().sum()结果为
0最后替换一下
data[Age] df
data[Age].isnull().sum()