概述:
“数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限而已”。线性模型是在统计机器学习中常用的模型,
我们假设解释变量和响应变量的关系是线性的。真实情况未必如此。如果想仿造一段曲线,那么首先应该保证曲线的起始点一样,
其次保证起始点处位移随时间的变化率一样(速度相同),再次应该保证前两者相等的同时关于时间的二阶变化率一样(加速度相同)……
如果随时间每一阶变化率(每一阶导数)都一样,那这俩曲线肯定是完全等价的
(附上怎样更好地理解并记忆泰勒展开式https://www.zhihu.com/questio…)。
python sklearn 实现:
sklearn.preprocessing.PolynomialFeatures(degree=2, interaction_only=False, include_bias=True)
参数说明:
degree:多项式次数(就同几元几次方程中的次数一样)
interaction_only:是否包含单个自变量**n(n>1)特征数据标识
include_bias:是否包含偏差标识
# 首先生成3x2的原始特征矩阵
# 即样本数为3,特征数为2
X = np.arange(6).reshape(3, 2)
print '原始数据:'
print X
# 特生变换/特征生成
# 将原始一阶数据升维到二阶数据
# 升维方式是: [x_1, x_2] 变为 [1, x_1, x_2, x_1^2, x_1 x_2, x_2^2]
polyFeat = PolynomialFeatures(degree=2)
X_transformed = polyFeat.fit_transform(X)
print '特征变换后的数据:'
print X_transformed
原始数据:
[[0 1]
[2 3]
[4 5]]
特征变换后的数据:
原始数据:
[[0 1]
[2 3]
[4 5]]
特征变换后的数据:
[[ 1. 0. 1. 0. 0. 1.]
[ 1. 2. 3. 4. 6. 9.]
[ 1. 4. 5. 16. 20. 25.]]
spark ml 实现:
val data = Array(
Vectors.dense(2.0, 1.0),
Vectors.dense(0.0, 0.0),
Vectors.dense(3.0, -1.0)
)
val df = spark.createDataFrame(data.map(Tuple1.apply)).toDF("features")
val polyExpansion = new PolynomialExpansion()
.setInputCol("features")
.setOutputCol("polyFeatures")
.setDegree(3)
val polyDF = polyExpansion.transform(df)