数据预处理的主要内容包括数据清洗、数据集成、数据变换和数据规约,它的工作量在数据挖掘过程中占60%。
4.1数据清洗
4.1.1缺失值处理
-
删除记录
-
不处理
-
数据插补
- 使用均值/中位数/众数插补
- 使用固定值插补
比如男生身高这个属性有空值,可以用全国的男生平均身高来插补,这是一个固定值。 - 最近临插补
用与有空值的样本最接近的样本的属性值来插补。比如可以和K_means算法一样求距离,求出距离含有空值的样本最近的那个样本,用其属性值来插补空值。
注:如果含有空值无法计算距离,可以先插补这个属性的均值 - 回归方法
将含有空值的属性记做y,将没有空值的其他属性记做x(x1,x2…xn),然后建立拟合模型来预测y的值。 - 插值法
-
拉格朗日插值法
利用已知的n个点对建立拉格朗日插值多项式,将缺失值对应的x带入插值函数得到近似值L(x)。 -
牛顿插值法
当点对的数量变化时,拉格朗日插值多项式的每一项都要变化,在实际计算中很不方便,所以提出了牛顿插值法。
(x1,y1),(x2,y2),(x3,y3)…(xn,yn)n个点对的一阶到n阶的差商公式如下:
其中y1=f(x1),y2=f(x2)…yn=f(xn)
将缺失值对应的点x带入牛顿插值多项式得到缺失值的近似值f(x)。可见点对数量变化时牛顿插值多项式只用在后部分增加或删除就可以了。
代码如下:
-
# -*- coding:utf-8 -*-
# 牛顿插值多项式
def get_n_diff_quo(xi, fi):
"""
计算n阶差商(difference quotient)
"""
if len(xi) > 2:
return (get_n_diff_quo(xi[:len(xi)-1], fi[:len(fi)-1])-get_n_diff_quo(xi[1:len(xi)], fi[1:len(fi)]))/(xi[0]-xi[-1])
return (fi[0]-fi[1])/(xi[0]-xi[1])
def get_w(xi):
"""
计算差商前面的系数
"""
def w(x):
result = 1.0
for i, j in enumerate(xi, start=1):
# 跳过xi的最后一项
if i == len(xi):
break
# print(j)
result *= (x - j)
return result
return w
def get_newton_interpolate(xi, fi):
"""
:param xi: xi存放点对的x坐标
:param fi: fi存放点对的y坐标
:return: 牛顿插值函数
"""
def newton_interpolate(x):
result = fi[0]
for i in range(2, len(xi)+1):
result += (get_n_diff_quo(xi[:i], fi[:i]) * get_w(xi[:i])(x))
return result
return newton_interpolate
if __name__ == '__main__':
train_x = [i for i in range(-10, 11)]
train_y = [i**2 for i in train_x]
newton_inter = get_newton_i