首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >KMeans=KMeans用于火种的情感分析

KMeans=KMeans用于火种的情感分析
EN

Stack Overflow用户
提问于 2016-01-05 16:43:56
回答 2查看 1.2K关注 0票数 2

我试着写一个基于火花的情感分析程序。为此,我使用了word2vec和KMeans集群。在word2Vec中,我在100维空间中收集了20k个单词/向量,现在我正在尝试将这个向量空间聚类。当我使用默认并行实现运行KMeans时,该算法工作了3个小时!但如果采用随机初始化策略,则需要8分钟的时间。我做错了什么?我有machine机器,有4个内核处理器和16 GB内存。

K ~= 4000 maxInteration为20

代码语言:javascript
复制
var vectors: Iterable[org.apache.spark.mllib.linalg.Vector] =
      model.getVectors.map(entry => new VectorWithLabel(entry._1, entry._2.map(_.toDouble)))
    val data = sc.parallelize(vectors.toIndexedSeq).persist(StorageLevel.MEMORY_ONLY_2)
    log.info("Clustering data size {}",data.count())
    log.info("==================Train process started==================");
    val clusterSize = modelSize/5

    val kmeans = new KMeans()
    kmeans.setInitializationMode(KMeans.K_MEANS_PARALLEL)
    kmeans.setK(clusterSize)
    kmeans.setRuns(1)
    kmeans.setMaxIterations(50)
    kmeans.setEpsilon(1e-4)

    time = System.currentTimeMillis()
    val clusterModel: KMeansModel = kmeans.run(data)

星星之火上下文初始化如下:

代码语言:javascript
复制
val conf = new SparkConf()
      .setAppName("SparkPreProcessor")
      .setMaster("local[4]")
      .set("spark.default.parallelism", "8")
      .set("spark.executor.memory", "1g")
    val sc = SparkContext.getOrCreate(conf)

也很少有关于运行这个程序的更新。我在Intelij内部运行它。我没有真正的星团。但我认为你的个人机器可以是星团

我看到这个程序挂在星火代码LocalKMeans.scala的循环中:

代码语言:javascript
复制
// Initialize centers by sampling using the k-means++ procedure.
    centers(0) = pickWeighted(rand, points, weights).toDense
    for (i <- 1 until k) {
      // Pick the next center with a probability proportional to cost under current centers
      val curCenters = centers.view.take(i)
      val sum = points.view.zip(weights).map { case (p, w) =>
        w * KMeans.pointCost(curCenters, p)
      }.sum
      val r = rand.nextDouble() * sum
      var cumulativeScore = 0.0
      var j = 0
      while (j < points.length && cumulativeScore < r) {
        cumulativeScore += weights(j) * KMeans.pointCost(curCenters, points(j))
        j += 1
      }
      if (j == 0) {
        logWarning("kMeansPlusPlus initialization ran out of distinct points for centers." +
          s" Using duplicate point for center k = $i.")
        centers(i) = points(0).toDense
      } else {
        centers(i) = points(j - 1).toDense
      }
    }
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-01-10 16:28:11

我在AWS上运行了3个从站(c3.xlarge),结果是相同的--问题是并行KMeans在N个并行运行中初始化algo,但是对于少量的数据,它仍然非常慢,我的解决方案是使用随机初始化。数据大小约为: 4k簇,用于21k,100-昏暗矢量。

票数 1
EN

Stack Overflow用户

发布于 2016-01-05 19:16:37

使用KMeans.K_MEANS_PARALLEL初始化比使用random更复杂。然而,这不应该有这么大的区别。我建议研究一下,是否需要很长时间的并行算法(它实际上应该比KMeans本身更有效)。

有关分析的信息,请参阅:http://spark.apache.org/docs/latest/monitoring.html

如果不是花费时间的初始化,就会有严重的错误。但是,使用随机初始化对最终结果不会更糟(只是效率更低!)。

实际上,当您使用KMeans.K_MEANS_PARALLEL初始化时,您应该通过0次迭代得到合理的结果。如果不是这样的话,数据的分布可能会有一些规律,从而使KMeans偏离轨道。因此,如果没有随机分发数据,也可以更改这一点。然而,这样的影响会让我惊讶地给出一个固定的迭代次数。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34616842

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档