Numpy和Sklearn两者的区别
在本文中,我们将介绍Numpy和sklearn两者之间的区别,以及在使用中的注意事项。
阅读更多:Numpy 教程
Numpy的定义
Numpy是使用Python语言进行科学计算的核心库。其中最重要的是它的N维数组(即ndarray)对象。Numpy提供了一些快捷数学函数和数据处理工具,可以用于进行数组操作和数据处理。
例如,可以通过一下代码产生一个随机二维数组:
import numpy as np
arr = np.random.rand(2, 3)
print(arr)
# Output:
# array([[0.77860495, 0.42405582, 0.08332795],
# [0.66088572, 0.75417526, 0.96561464]])
Sklearn的定义
Sklearn是Python环境下的机器学习库,SVM、聚类、决策树等常用机器学习算法都已经实现在sklearn库中。封装了许多经典的机器学习算法和数据处理工具。同时也是大量机器学习竞赛 (Kaggle/Opendata)的必选库。
结合Numpy,sklearn可以进行大量的实际应用,比如我们在使用StandardScaler时,怎么样保证经过StandardScaler后得到的数据经过Numpy的计算后均值为0。
Numpy和Sklearn的区别
Sklearn的StandarScaler可以将数据标准化,它会将数据的均值变为0,方差变为1,这样的处理方式使得其数据更易于分析和比较。当我们使用Numpy进行一些数学计算时,我们希望得到的是标准化数据的均值也是0,但是这时候可能会出现意想不到的问题,我们可以看下面一段代码。
from sklearn.preprocessing import StandardScaler
import numpy as np
X = np.array([3*[2], 3*[3]])
scaler = StandardScaler().fit(X)
X_std = scaler.transform(X)
print(np.mean(X_std, axis=0))
# output:
# [0. 0.]
我们期望得到的结果是[0. 0.]。然而,这个结果是有一定概率的,也就是说,当我们得到X_std后求平均值,不一定会得到[0. 0.]。事实上,结果也可能会变成[1.11022302e-16,-1.11022302e-16],这是因为numpy做不到像StandardScaler那样精确地计算。
对比差异出现的原因
在StandardScaler中,如果数据存在一个固定的偏移量或者偏离限制,那么此时就会出现上述的情况。StandardScaler产生的形式为:
z= \frac{x-\bar{x}}{\delta}
其中z是标准化后的数据,x是原始数据,\bar{x}是均值,\delta是标准差。但是,由于分布不均,因此\bar{x}可能存在一个固定的偏移量,或者存在一个偏离点的限制。在数组上进行除法时,这些固定的值将会被舍入处理,导致标准化数据的均值不再是0。
除了除法和减法之外,StandardScaler包括除以标准差矩阵以得到维度位置。在这种情况下,x-\bar{x}不会产生数字溢出,但是定值增加会导致标准化数据的均值不为0。
如何解决这个问题
解决这个问题的方法很简单,我们只需要在数组上调用round()
函数即可。这样,数组上的固定偏移量和偏离点限制就可以被减轻或消除了,从而确保标准化数据的均值是0。如下所示:
from sklearn.preprocessing import StandardScaler
import numpy as np
X = np.array([3*[2], 3*[3]])
scaler = StandardScaler().fit(X)
X_std = scaler.transform(X)
print(np.mean(np.round(X_std, decimals=8), axis=0))
# output:
# [0. 0.]
在上述示例中,我们加了一个round()
函数并且指定了小数点位数,以减少舍入误差,得到了正确的标准化数据的均值为[0. 0.]。
总结
本文介绍了Numpy和sklearn两者的定义,及其在实际使用中存在的差异。我们发现,由于分布不均,StandardScaler可能存在固定偏移量和偏离点限制,从而导致标准化数据的均值不为0,在使用Numpy进行计算时产生问题。但是,可以通过在数组上调用round()
函数解决这个问题。因此,在使用Numpy进行数据处理时,需要注意StandardScaler标准化数据的均值问题,以免产生错误的结果。