Spark (Scala) 中的 K-means - 当模型由标准化数据制作时,如何将集群编号映射回客户 ID

Posted

技术标签:

【中文标题】Spark (Scala) 中的 K-means - 当模型由标准化数据制作时,如何将集群编号映射回客户 ID【英文标题】:K-means in Spark (Scala) - How to map cluster numbers back to customer ID when model was made from standardized data 【发布时间】:2016-10-10 22:08:42 【问题描述】:

以下代码用于获取模型。我面临的问题是将集群编号映射回客户 ID。这是因为,我的模型是在标准化数据上进行训练的,但带有客户 ID 的数据具有未标准化的数据。我无法弄清楚如何映射回来。

import org.apache.spark.SparkContext._
import org.apache.spark.mllib.clustering.KMeans, KMeansModel
import org.apache.spark.mllib.linalg.Vectors
import scala.collection.mutable.ArrayBuffer
import org.apache.spark.mllib.feature.StandardScaler
import org.apache.spark.mllib.util.MLUtils
// importing the data for clustering
val data = sc.textFile("hdfs://path/data_for_clus1") 
val vectors = data.map(s => s.split('\1')).map(s => s.slice(1, s.size)) 
val parsedData =  vectors.map(s => Vectors.dense(s.map(_.toDouble)))    

val dataAsArray = parsedData.map(_.toArray)  
// Using Standardscaler to standardize data
val features = dataAsArray.map(a => Vectors.dense(a))
val scaler = new StandardScaler(withMean = true, withStd = true).fit(features) 
val scaledFeatures = scaler.transform(features) 


val WSSEBuffer = ArrayBuffer[Double](); 
// K-means
val numClusters = 20
val numIterations = 500
val clusters = KMeans.train(scaledFeatures, numClusters, numIterations)
val WSSSE = clusters.computeCost(scaledFeatures)

使用“集群”模型,我想将集群编号提供给“数据”表中存在的客户 ID。

【问题讨论】:

【参考方案1】:

将您的数据解析为

val newdata = Array[(customerID, featureArray)]

然后

newdata.map(customer => (customer._1, clusters.predict(customer._2)))

不确定这是否是一种有效的方法

【讨论】:

以上是关于Spark (Scala) 中的 K-means - 当模型由标准化数据制作时,如何将集群编号映射回客户 ID的主要内容,如果未能解决你的问题,请参考以下文章

k-means 使用 Spark/Scala 对地理定位数据进行聚类

使用scala在Spark中查看相关矩阵的所有列

Scala 中用于 mllib 的 java.lang.NumberFormatException

将 Scala 的 K-means 应用于 rdd 的每个元素。

使用 k-means 聚类时如何设置 spark 配置以减少洗牌?

每行加入两个不同的RDD - Scala