首页 > 其他分享 >使用Kmeans对Word2vec的输出做聚类

使用Kmeans对Word2vec的输出做聚类

时间:2023-06-09 13:32:09浏览次数:34  
标签:map plt Word2vec val Kmeans 聚类 spark row

Word2vec会产出每个词语的权重向量


使用这个向量,可以直接对所有的词语聚类


以下代码,以word2vec的model作为输入,进行kmeans训练,同时进行K的迭代计算,选出WSSSE最小的K值


Scala


 

* 将word2vec的结果,作为kmeans的输入进行聚类;进行K的多次迭代,选出WSSSE最小的K
      * @param spark
      * @param model
      */
     def word2vecToKmeans ( spark : SparkSession , model : org . apache . spark . mllib . feature . Word2VecModel ) = {
         import org . apache . spark . mllib . clustering . { KMeans , KMeansModel }
         import org . apache . spark . mllib . linalg . Vectors
 
         // val parsedData = data.map(s => Vectors.dense(s.split(' ').map(_.toDouble))).cache()
         val parsedData = model . getVectors . map ( row = > Vectors . dense ( row . _2 . map ( _ . toDouble ) ) ) . toSeq
         val parsedDataRDD = spark . sparkContext . parallelize ( parsedData ) . cache ( )
 
         // Cluster the data into two classes using KMeans
 
         val numKList = 2 to 20
 
         numKList . foreach (
             k = > {
                 val numIterations = 50
                 val clusters = KMeans . train ( parsedDataRDD , k , numIterations )
 
                 // Evaluate clustering by computing Within Set Sum of Squared Errors
                 val WSSSE = clusters . computeCost ( parsedDataRDD )
                 println ( s "K==${k}, Within Set Sum of Squared Errors = $WSSSE" )
             }
         )
     }

这里使用的是mllib的库


算出来的K值和WSSSE的对应关系为:


2 737409.9793517443 3 680667.1717807942 4 646796.9586209953 5 621979.831387794 6 600079.2948154274 7 583517.901818578 8 568308.9391577758 9 558225.3643934435 10 553948.317112428 11 548844.8163327919 12 534551.2249848123 13 530924.4903488192 14 525710.9272857339 15 523946.17442620965 16 516929.85870202346 17 511611.2490293131 18 510014.93372050225 19 503478.81601442746 20 500293.188117236


2 737409.9793517443
3 680667.1717807942
4 646796.9586209953
5 621979.831387794
6 600079.2948154274
7 583517.901818578
8 568308.9391577758
9 558225.3643934435
10 553948.317112428
11 548844.8163327919
12 534551.2249848123
13 530924.4903488192
14 525710.9272857339
15 523946.17442620965
16 516929.85870202346
17 511611.2490293131
18 510014.93372050225
19 503478.81601442746
20 500293.188117236

使用如下代码进行绘图:



#coding:utf8
 
import matplotlib . pyplot as plt
 
x = [ ]
wssse = [ ]
for line in open ( "kmeans_k_wssse.txt" ) :
     line = line [ : - 1 ]
     fields = line . split ( "\t" )
     if len ( fields ) != 2 :
         continue
     x . append ( int ( fields [ 0 ] ) )
     wssse . append ( float ( fields [ 1 ] ) )
 
plt . xlabel ( 'k' )
plt . ylabel ( 'SSE' )
plt . plot ( x , wssse , 'o-' )
plt . show ( )

图片如下:





并不是完美的手肘,不过拐点大概在8、9的位置,以8或者9来聚类比较合适



也可以打印距离每个中心的10个数据


Scala


val distData = model . getVectors . map ( row = > {
             val word = row . _1
             val probVector = Vectors . dense ( row . _2 . map ( _ . toDouble ) )
             val predictK = clusters . predict ( probVector )
             val centerVector = clusters . clusterCenters ( predictK )
             // 计算当前点,到当前中心的距离
             val dist = Vectors . sqdist ( probVector , centerVector )
             ( predictK , word , dist )
         } ) . toSeq
         val distRdd = spark . sparkContext . parallelize ( distData )
 
         val groupData = distRdd . map ( row = > ( row . _1 , ( row . _2 , row . _3 ) ) ) . groupByKey ( )
         // 打印距离每个中心的10个点
         groupData . map ( row = > {
             ( row . _1 , row . _2 . toList . sortWith ( ( a , b ) = > a . _2 < b . _2 ) . take ( 10 ) )
         } ) . collect ( ) . foreach ( row = > {
             row . _2 . foreach (
                 row2 = > println ( s "${row._1}\t${row2._1}\t${row2._2}" )
             )
         } )


然而,查看数据,并不能得到为啥这么分类,聚类的结果不好分析~~



参考文章:




K-MEANS-SPARK文档:https://spark.apache.org/docs/2.2.0/mllib-clustering.html#k-means


标签:map,plt,Word2vec,val,Kmeans,聚类,spark,row
From: https://blog.51cto.com/peishuai/6446927

相关文章

  • 0010.有监督学习之K-均值聚类
    一、聚类分析概述1.簇的定义2.常用的聚类算法二、K-均值聚类算法1.K-均值算法的python实现1.1导入数据集1.2构建距离计算函数1.3编写自动生成随机质心的函数1.4编写K-Means聚类函数2.算法验证3.误差平方和SSE计算三、模型收敛稳定性探讨四、二分K-均值算法1......
  • 基于聚类和神经网络的图像颜色提取和评分方案
    概述图像颜色提取的前端React方案,基于canvas,使用K均值聚类算法提取主要颜色(颜色量子化),用离线训练的神经网络进行评分,附带可视化方案和相关动画。详细本文github地址:colorful-color。体验 demo。一、目录结构本项目是基于React编写的,build目录下有编译好的版本,编译源......
  • 数据分享|MATLAB、R基于Copula方法和k-means聚类的股票选择研究上证A股数据|附代码数
    全文链接:http://tecdat.cn/?p=31733最近我们被客户要求撰写关于Copula的研究报告,包括一些图形和统计输出。Copula方法是测度金融市场间尾部相关性比较有效的方法,而且可用于研究非正态、非线性以及尾部非对称等较复杂的相依特征关系因此,Copula方法开始逐渐代替多元GARCH模型的相......
  • K-Means算法--聚类算法
    在数据挖掘中,K-Means算法是一种clusteranalysis的算法,其主要是来计算数据聚集的算法,主要通过不断地取离种子点最近均值的算法。问题K-Means算法主要解决的问题如下图所示。我们可以看到,在图的左边有一些点,我们用肉眼可以看出来有四个点群,但是我们怎么通过计算机程序找出这几个点群......
  • SREWorks v1.5 版本发布 | 基于实时作业平台的日志聚类开源
    在经过v1.0\~v1.4四个版本迭代后,SREWorks的核心底座已经表现出极高的稳定性和成熟性。在v1.5版本中,SREWorks开发团队在核心底座上,进行了较多的数智化能力迭代。同时,在数智能力迭代过程中,我们也维持着与SREWorks用户较高的沟通频率。我们发现大家普遍对于监控数据之上的数智化能力比......
  • word2vec (一) 简介与训练过程概要
    词的向量化与word2vec简介word2vec最初是TomasMikolov发表的一篇文章[1],同时开源了相应的代码,作用是将所有词语投影到K维的向量空间,每个词语都可以用一个K维向量表示。为什么要将词用向量来表示呢?这样可以给词语一个数学上的表示,使之可以适用于某些算法或数学模型。通常将词语表示......
  • python spark kmeans demo
    官方的demofromnumpyimportarrayfrommathimportsqrtfrompysparkimportSparkContextfrompyspark.mllib.clusteringimportKMeans,KMeansModelsc=SparkContext(appName="clusteringExample")#Loadandparsethedatadata=sc.textFile("/......
  • MATLAB用改进K-Means(K-均值)聚类算法数据挖掘高校学生的期末考试成绩|附代码数据
    全文链接:http://tecdat.cn/?p=30832最近我们被客户要求撰写关于K-Means(K-均值)聚类算法的研究报告,包括一些图形和统计输出。本文首先阐明了聚类算法的基本概念,介绍了几种比较典型的聚类算法,然后重点阐述了K-均值算法的基本思想,对K-均值算法的优缺点做了分析,回顾了对K-均值改进......
  • 神经网络中embedding层作用——本质就是word2vec,数据降维,同时可以很方便计算同义词(各
    Embeddingtflearn.layers.embedding_ops.embedding(incoming,input_dim,output_dim,validate_indices=False,weights_init='truncated_normal',trainable=True,restore=True,reuse=False,scope=None,name='Embedding')Embeddinglayerforase......
  • 聚类算法:ISODATA算法 ——kmeans算法升级版,不知道k也可以,但是需要你自己指定其他参数
    当K值的大小不确定时,可以使用ISODATA算法。ISODATA的全称是迭代自组织数据分析法。在K均值算法中,聚类个数K的值需要预先人为地确定,并且在整个算法过程中无法更改。而当遇到高维度、海量的数据集时,人们往往很难准确地估计出K的大小。ISODATA算法就是针对这个问题进行了改进,它的思想......