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 中用于 mllib 的 java.lang.NumberFormatException
将 Scala 的 K-means 应用于 rdd 的每个元素。