大规模数据的PCA降维

13 篇文章 0 订阅
8 篇文章 2 订阅

20200810 -

0. 引言

最近在做的文本可视化的内容,文本处理的方法是利用sklearn的CountVer+Tf-idf,这样处理数据之后,一方面数据的维度比较高,另一方面呢,本身这部分数据量也比较大。如果直接使用sklearn的pca进行降维,会很慢,而且pca也没有n_jobs来支持多线程工作。不过,我看到spark中已经支持的pca了,所以希望通过spark来实现这部分内容。

1. spark的PCA算法

1.1 官方使用示例

>>> from pyspark.ml.linalg import Vectors
>>> data = [(Vectors.sparse(5, [(1, 1.0), (3, 7.0)]),),
...     (Vectors.dense([2.0, 0.0, 3.0, 4.0, 5.0]),),
...     (Vectors.dense([4.0, 0.0, 0.0, 6.0, 7.0]),)]
>>> df = spark.createDataFrame(data,["features"])
>>> pca = PCA(k=2, inputCol="features", outputCol="pca_features")
>>> model = pca.fit(df)
>>> model.transform(df).collect()[0].pca_features
DenseVector([1.648..., -4.013...])
>>> model.explainedVariance
DenseVector([0.794..., 0.205...])
>>> pcaPath = temp_path + "/pca"
>>> pca.save(pcaPath)
>>> loadedPca = PCA.load(pcaPath)
>>> loadedPca.getK() == pca.getK()
True
>>> modelPath = temp_path + "/pca-model"
>>> model.save(modelPath)
>>> loadedModel = PCAModel.load(modelPath)
>>> loadedModel.pc == model.pc
True
>>> loadedModel.explainedVariance == model.explainedVariance
True

上面的代码是spark的官方文档(2.4.4版本)的实例介绍;从中可以看出,对于PCA使用过程来说,没有什么不一样的。
其实我比较关注的是,假设,我开始的数据,更直接点说就是已经经过预处理的数据,他们现在是一个高维的向量,他们的数据类型是numpy.narray,这种形式的数据怎么传递到spark中,然后应用上面部分的代码。那么,比较关键的地方就是上面的data部分,这部分应该怎么处理。

1.2 个人使用方式

在谷歌搜索的时候,发现了某个代码[1];他利用iris数据作为示例来进行讲解,下面来看看他具体的步骤。

1.2.1 加载数据

iris = load_iris()
X = iris['data']
y = iris['target']

data = pd.DataFrame(X, columns = iris.feature_names)
dataset = spark.createDataFrame(data, iris.feature_names)
dataset.show(6)

上述代码的步骤如下:
1)加载iris数据
2)创建pandas的DF
3)创建spark的DF
也就是说,这个时候就创建了numpy与spark中df的联系。

1.2.2 将向量集中于一列

# specify the input columns' name and
# the combined output column's name
assembler = VectorAssembler(
    inputCols = iris.feature_names, outputCol = 'features')
    
# use it to transform the dataset and select just
# the output column
df = assembler.transform(dataset).select('features')
df.show(6)
# output :
'''
+-----------------+
|         features|
+-----------------+
|[5.1,3.5,1.4,0.2]|
|[4.9,3.0,1.4,0.2]|
|[4.7,3.2,1.3,0.2]|
|[4.6,3.1,1.5,0.2]|
|[5.0,3.6,1.4,0.2]|
|[5.4,3.9,1.7,0.4]|
+-----------------+
only showing top 6 rows
'''

在之前的一篇文章《Spark机器学习实例》中也有这部分的操作,不过当时代码是这样的:

from pyspark.mllib.regression import LabeledPoint
from pyspark.mllib.linalg import Vectors
data = iris_data.rdd.map(lambda row: LabeledPoint(row[-1], Vectors.dense(row[:-1])))

本质上是一个道理,都是讲特征部分汇总到一个向量中。

1.2.3 向量归一化

scaler = StandardScaler(
    inputCol = 'features', 
    outputCol = 'scaledFeatures',
    withMean = True,
    withStd = True
).fit(df)

# when we transform the dataframe, the old
# feature will still remain in it
df_scaled = scaler.transform(df)
df_scaled.show(6)

这部分没什么可说的, 就是归一化向量,然后应用于PCA。

1.2.4 使用PCA

n_components = 2
pca = PCA(
    k = n_components, 
    inputCol = 'scaledFeatures', 
    outputCol = 'pcaFeatures'
).fit(df_scaled)

df_pca = pca.transform(df_scaled)
print('Explained Variance Ratio', pca.explainedVariance.toArray())
df_pca.show(6)

上面部分代码是做PCA的核心部分,通过这部分内容就可以得到相应的降维数据了。

1.2.5 取出降维后的数据

# not sure if this is the best way to do it
X_pca = df_pca.rdd.map(lambda row: row.pcaFeatures).collect()
X_pca = np.array(X_pca)

这部分代码应该可以直接使用key来获取某一列,不需要再用RDD

1.3 小节

关于这部分内容,关于PCA的使用没有什么多说的,只需要按照其接口说明传递参数然后获取相应的内容即可。关键部分是前期的预处理,怎么将数据弄成满足后续PCA处理形式的数据
前面的代码应该就足够了,后续针对自己的数据来实践以下。

参考文章

[1]spark pca

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 数据降维通常被认为是数据挖掘和机器学习中的重要工具。它的目的是在不丢失太多信息的情况下减少数据的维数以便于处理。PCA和t-SNE是两种常见的降维技术。下面我们来看看它们之间的区别: PCA(Principal Component Analysis,主成分分析)是一种线性降维方法。它通过线性变换将高维数据映射到低维空间,保留尽可能多的原始数据的信息。在PCA中,数据由它的主成分分析的线性组合表示。主成分分析能有效地捕捉到数据的方差结构,但是它可能会忽略重要的非线性结构。PCA不适合用于非线性数据集的降维。 t-SNE(t-Distributed Stochastic Neighbor Embedding,t分布随机邻居嵌入)是一种非线性降维方法。它能够有效地处理高维空间中的非线性关系,并可将这些关系表现在低维空间中。t-SNE能够用来发现数据的嵌入模式,它考虑到每个领域中的所有点,而不仅仅是最近邻点。但是t-SNE计算复杂度较高,需要大量的计算时间和内存资源。 综上所述,PCA和t-SNE是两种不同的降维方法。PCA是一种线性降维方法,适合于线性数据集。t-SNE是一种非线性降维方法,适合于非线性数据集。在选择降维方法时,应该根据数据的结构和降维目的来选择。 ### 回答2: tsne和pca都是常用的降维方法,它们的目的都是将高维数据映射到一个低维空间,以便于可视化和数据分析。 首先,tsne和pca降维方式不同。pca基于数据的协方差矩阵,通过对其进行特征值分解来得到主成分,也就是数据投影后的新坐标轴。而tsne基于高维数据的相似性度量,通过在低维空间中最小化样本间的KL距离,来将高维数据映射为低维表示。 其次,tsne和pca降维效果也有所不同。pca主要关注保持原有数据的方差,将方差大的特征投影到主成分上,保留最显著的信息。相较而言,tsne基于局部相似度的聚类,更适用于寻找数据中的团簇结构(类似于k-means 算法),得到的降维结果更具有可解释性、更适用于数据分类、聚类等数据挖掘任务。 再次,tsne的计算比pca更慢。由于tsne相比于pca多了一个KL散度的计算,同时将高维空间中的相似性转化为低维空间中的概率分布,因此tsne算法计算的复杂度和时间更高。不过,tsne得到的结果比pca更具有可解释性,同时也能更好地反映数据中的局部结构。 总之,tsne和pca都是常用的降维方法,并且在不同的应用场景中有不同的表现和优劣。在实际应用中,需要根据具体问题的需求来选择适合的降维方法。 ### 回答3: PCA(Principal Component Analysis)和t-SNE(t-Distributed Stochastic Neighbor Embedding)是常见的降维方法。它们都是将高维数据转换为低维表示,以便于数据处理和可视化。下面来介绍一下它们的主要区别。 首先,PCA是一种线性降维方法,它的主要思想是找到使得数据方差最大的方向,然后将数据投影到这个方向上得到一个新的一维(或多维)空间,如下图所示: ![PCA Demo](https://i.imgur.com/LvOinjD.png) 在这个新的一维空间中,数据之间的距离可以被保留,但是数据的原始特征会被丢失。而t-SNE则是一种非线性降维方法,它的主要思想是将高维数据映射到低维空间中,同时保持数据之间局部距离的相对关系,全局距离的相对关系则可以被忽略。如下图所示: ![t-SNE Demo](https://i.imgur.com/4QoovV9.png) 可以看到,在低维空间中,数据点之间的距离关系可能会被扭曲,但是相对的局部距离关系被保留。 其次,PCA和t-SNE的应用场景也有所不同。PCA适用于线性数据降维,尤其是在大量样本数据中找到主成分进行压缩;而t-SNE主要适用于高维数据聚类分析、可视化、异常值检测等,尤其是当数据之间的相对位置关系比较重要时。 再次,PCA和t-SNE在计算速度上也有一定区别。PCA可以使用特征值分解等一些快速算法进行计算,速度相对较快;而t-SNE的计算速度较慢,尤其在大规模数据处理时需要较长时间。 总之,PCA和t-SNE在降维的基本思路、适用场景和计算速度等方面存在差异。在具体应用时需要根据数据类型和处理目的选择合适的降维方法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值