概述:

“数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限而已”。线性模型是在统计机器学习中常用的模型,
我们假设解释变量和响应变量的关系是线性的。真实情况未必如此。如果想仿造一段曲线,那么首先应该保证曲线的起始点一样,
其次保证起始点处位移随时间的变化率一样(速度相同),再次应该保证前两者相等的同时关于时间的二阶变化率一样(加速度相同)……
如果随时间每一阶变化率(每一阶导数)都一样,那这俩曲线肯定是完全等价的
(附上怎样更好地理解并记忆泰勒展开式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)

HelloData
15 声望3 粉丝