如何将矢量变换为阵列进行频繁模式分析

2024-09-27 07:30:13 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在应用一个频繁的模式分析,需要一些输入类型的帮助。在

首先,我使用stringindexer将分类变量转换为数字。在

然后,我为每个分类值创建一个唯一的数字,如下所示:

add_100=udf(lambda x:x+100,returnType=FloatType())
add_1000=udf(lambda x:x+1000,returnType=FloatType())
df = df.select('cat_var_1', add_1000('cat_var_2').alias('cat_var_2_final'), add_10000('cat_var_3').alias('cat_var_3_final'))

我的下一步是创建一个具有以下特征的向量:

^{pr2}$

最后,我尝试适合我的模型:

from pyspark.ml.fpm import FPGrowth
fpGrowth = FPGrowth(itemsCol="features", minSupport=0.5, minConfidence=0.6)

model = fpGrowth.fit(df)

得到这个错误:

u'requirement failed: The input column must be ArrayType, but got org.apache.spark.ml.linalg.VectorUDT@3bfc3ba7.

所以,问题是,如何将向量转换成数组?或者,我还有别的办法解决这个问题吗?在


Tags: lambdaadddfvar分类alias数字向量
2条回答

我想,你不需要自定义项来创建独一无二的号码。或者您可以直接使用with column,例如

df = df.withColumn('cat_var_2_final',df['cat_var_2']+100).withColumn('cat_var_3_final',df['cat_var_3']+1000)

另外,如果您只对FPGrowth模型使用这些数据,我们也可以跳过向量汇编程序,直接使用udf as创建数组特性

^{pr2}$

FPGrowth使用数组而不是向量。由于VectorAssembler将给您一个矢量作为输出,一个可能的简单解决方案是使用UDF将输出转换为数组。在

to_array = udf(lambda x: x.toArray(), ArrayType(DoubleType()))
df = df.withColumn('features', to_array('features'))

更好的解决方案是一次完成所有操作,即根本不使用VectorAssembler。这样做的好处是根本不需要UDF,因此速度更快。这将使用pyspark中内置的array函数。在

^{pr2}$

相关问题 更多 >

    热门问题