K-Means是常用的聚类算法,与其他聚类算法相比,其时间复杂度低,聚类的效果也还不错,这里简单介绍一下k-means算法,下图是一个手写体数据集聚类的结果。

基本思想

 k-means算法需要事先指定簇的个数k,算法开始随机选择k个记录点作为中心点,然后遍历整个数据集的各条记录,将每条记录归到离它最近的中心点所在的簇中,之后以各个簇的记录的均值中心点取代之前的中心点,然后不断迭代,直到收敛,算法描述如下:

  上面说的收敛,可以看出两方面,一是每条记录所归属的簇不再变化,二是优化目标变化不大。算法的时间复杂度是O(K*N*T),k是中心点个数,N数据集的大小,T是迭代次数。

优化目标

  k-means的损失函数是平方误差:

RSSk=∑x∈ωk|x−u(ωk)|2
RSS=∑k=1KRSSk

  其中ωk表示第k个簇,u(ωk)表示第k个簇的中心点,RSSk是第k个簇的损失函数,RSS表示整体的损失函数。优化目标就是选择恰当的记录归属方案,使得整体的损失函数最小。

中心点的选择

  k-meams算法的能够保证收敛,但不能保证收敛于全局最优点,当初始中心点选取不好时,只能达到局部最优点,整个聚类的效果也会比较差。可以采用以下方法:k-means中心点

  1、选择彼此距离尽可能远的那些点作为中心点;

  2、先采用层次进行初步聚类输出k个簇,以簇的中心点的作为k-means的中心点的输入。

  3、多次随机选择中心点训练k-means,选择效果最好的聚类结果

k值的选取

  k-means的误差函数有一个很大缺陷,就是随着簇的个数增加,误差函数趋近于0,最极端的情况是每个记录各为一个单独的簇,此时数据记录的误差为0,但是这样聚类结果并不是我们想要的,可以引入结构风险对模型的复杂度进行惩罚:

  

K=mink[RSSmin(k)+λk]

  λ是平衡训练误差与簇的个数的参数,但是现在的问题又变成了如何选取λ了,有研究[参考文献1]指出,在数据集满足高斯分布时,λ=2m,其中m是向量的维度。

  另一种方法是按递增的顺序尝试不同的k值,同时画出其对应的误差值,通过寻求拐点来找到一个较好的k值,详情见下面的文本聚类的例子。

k-means文本聚类

  我爬取了36KR的部分文章,共1456篇,分词后使用sklearn进行k-means聚类。分词后数据记录如下:

  使用TF-IDF进行特征词的选取,下图是中心点的个数从3到80对应的误差值的曲线:

  从上图中在k=10处出现一个较明显的拐点,因此选择k=10作为中心点的个数,下面是10个簇的数据集的个数。

{0: 152, 1: 239, 2: 142, 3: 61, 4: 119, 5: 44, 6: 71, 7: 394, 8: 141, 9: 93}

簇标签生成

  聚类完成后,我们需要一些标签来描述簇,聚类完后,相当于每个类都用一个类标,这时候可以用TFIDF、互信息、卡方等方法来选取特征词作为标签。关于卡方和互信息特征提取可以看我之前的文章文本特征选择,下面是10个类的tfidf标签结果。

Cluster 0: 商家 商品 物流 品牌 支付 导购 网站 购物 平台 订单
Cluster 1: 投资 融资 美元 公司 资本 市场 获得 国内 中国 去年
Cluster 2: 手机 智能 硬件 设备 电视 运动 数据 功能 健康 使用
Cluster 3: 数据 平台 市场 学生 app 移动 信息 公司 医生 教育
Cluster 4: 企业 招聘 人才 平台 公司 it 移动 网站 安全 信息
Cluster 5: 社交 好友 交友 宠物 功能 活动 朋友 基于 分享 游戏
Cluster 6: 记账 理财 贷款 银行 金融 p2p 投资 互联网 基金 公司
Cluster 7: 任务 协作 企业 销售 沟通 工作 项目 管理 工具 成员
Cluster 8: 旅行 旅游 酒店 预订 信息 城市 投资 开放 app 需求
Cluster 9: 视频 内容 游戏 音乐 图片 照片 广告 阅读 分享 功能

实现代码

#!--encoding=utf-8from __future__ import print_function
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.feature_extraction.text import HashingVectorizer
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans, MiniBatchKMeansdef loadDataset():'''导入文本数据集'''f = open('36krout.txt','r')dataset = []lastPage = Nonefor line in f.readlines():if '< title >' in line and '< / title >' in line:if lastPage:dataset.append(lastPage)lastPage = lineelse:lastPage += lineif lastPage:dataset.append(lastPage)f.close()return datasetdef transform(dataset,n_features=1000):vectorizer = TfidfVectorizer(max_df=0.5, max_features=n_features, min_df=2,use_idf=True)X = vectorizer.fit_transform(dataset)return X,vectorizerdef train(X,vectorizer,true_k=10,minibatch = False,showLable = False):#使用采样数据还是原始数据训练k-means,    if minibatch:km = MiniBatchKMeans(n_clusters=true_k, init='k-means++', n_init=1,init_size=1000, batch_size=1000, verbose=False)else:km = KMeans(n_clusters=true_k, init='k-means++', max_iter=300, n_init=1,verbose=False)km.fit(X)    if showLable:print("Top terms per cluster:")order_centroids = km.cluster_centers_.argsort()[:, ::-1]terms = vectorizer.get_feature_names()print (vectorizer.get_stop_words())for i in range(true_k):print("Cluster %d:" % i, end='')for ind in order_centroids[i, :10]:print(' %s' % terms[ind], end='')print()result = list(km.predict(X))print ('Cluster distribution:')print (dict([(i, result.count(i)) for i in result]))return -km.score(X)def test():'''测试选择最优参数'''dataset = loadDataset()    print("%d documents" % len(dataset))X,vectorizer = transform(dataset,n_features=500)true_ks = []scores = []for i in xrange(3,80,1):        score = train(X,vectorizer,true_k=i)/len(dataset)print (i,score)true_ks.append(i)scores.append(score)plt.figure(figsize=(8,4))plt.plot(true_ks,scores,label="error",color="red",linewidth=1)plt.xlabel("n_features")plt.ylabel("error")plt.legend()plt.show()def out():'''在最优参数下输出聚类结果'''dataset = loadDataset()X,vectorizer = transform(dataset,n_features=500)score = train(X,vectorizer,true_k=10,showLable=True)/len(dataset)print (score)
#test()
out()

  本文完,欢迎留言交流。

参考文献

  [1].王斌. 信息检索导论

转载请注明出处:http://www.cnblogs.com/fengfenggirl/

K-means算法及文本聚类实践相关推荐

  1. kmeans改进 matlab,基于距离函数的改进k―means 算法

    摘要:聚类算法在自然科学和和社会科学中都有很普遍的应用,而K-means算法是聚类算法中经典的划分方法之一.但如果数据集内相邻的簇之间离散度相差较大,或者是属性分布区间相差较大,则算法的聚类效果十分有 ...

  2. 数据挖掘:基于朴素贝叶斯分类算法的文本分类实践

    前言: 如果你想对一个陌生的文本进行分类处理,例如新闻.游戏或是编程相关类别.那么贝叶斯分类算法应该正是你所要找的了.贝叶斯分类算法是统计学中的一种分类方法,它利用概率论中的贝叶斯公式进行扩展.所以, ...

  3. 【项目实战】Python基于KMeans算法进行文本聚类项目实战

    说明:这是一个机器学习实战项目(附带数据+代码+文档+视频讲解),如需数据+代码+文档+视频讲解可以直接到文章最后获取. 1.项目背景 随着计算机技术的发展.Web 应用的逐步普及,大量的电子文本已经 ...

  4. 基于K均值算法的鸢尾花聚类实验(Sklearn实现)

    实验代码 ##### 相关库导入部分 ##### from sklearn.datasets import load_iris import pandas as pd from sklearn.pre ...

  5. k means算法C语言伪代码,K均值算法(K-Means)

    1. K-Means算法步骤 算法步骤 收敛性定义,畸变函数(distortion function): 伪代码: 1) 创建k个点作为K个簇的起始质心(经常随机选择) 2) 当任意一个点的蔟分配结果 ...

  6. R实现K均值算法,层次聚类算法与DBSCAN算法

    1.聚类的基本概念 聚类分析(cluster analysis)仅根据在数据中发现的描述对象及其关系的信息,将数据对象分组.其目标是,组内的对象相互之间是相似的(相关的),而不同组中的对象是不同的(不 ...

  7. Bert文本聚类实践

    问题来源: 先做的huggingface-bert文本分类(参考text-classification,情感分类,数据集可以考虑SST2),但是数据量太大了,无法穷举所有的类别,故而先用分类来做,但这 ...

  8. k均值聚类算法(K Means)及其实战案例

    算法说明 K均值聚类算法其实就是根据距离来看属性,近朱者赤近墨者黑.其中K表示要聚类的数量,就是说样本要被划分成几个类别.而均值则是因为需要求得每个类别的中心点,比如一维样本的中心点一般就是求这些样本 ...

  9. 基于 K-means 算法实现的文本聚类(干货)

    k-means算法又称k均值,顾名思义就是通过多次求均值而实现的聚类算法.是一种无监督的机器学习方法,即无需知道所要搜寻的目标,而是直接通过算法来得到数据的共同特征.其具体算法思想如下图所示: 1.首 ...

最新文章

  1. Day14:使用斯坦福 NER 软件包实现你自己的命名实体识别器
  2. Java线程详解(5)-线程的同步与锁
  3. Leetcode-翻转图像(832)
  4. 记事本中写c/c++程序在Windows下执行
  5. 团队作业9——第二次项目冲刺2(Beta阶段)
  6. python中r55的执行结果是_import numpy as np
  7. The repository does not have a Release
  8. 泡面比泡MM好的16个理由
  9. android spinner保存对象,Android Spinner默认值问题
  10. 【Unity3D应用案例系列】Unity3D中实现《3D照片墙》
  11. 如何在批处理/ cmd中“注释掉”(添加注释)?
  12. Git系列——删除文件的找回
  13. 一、高并发秒杀API简介与业务分析
  14. VBA小程序_对于选中的单元格进行取消合并_选择空值向上填充
  15. [python] 基于Gradio可视化部署机器学习应用
  16. 电脑开机时stage 1 fo 3 stage 2 fo 3 Checking file system on D:
  17. 趣拿场景营销拥有哪些黑科技
  18. 微信公众系列之百度天气预报开发
  19. 最新 2022欧莱雅AI面试真题题库
  20. Vue单文件中引入背景图片时,四周有空白的问题

热门文章

  1. gorm记一次joins查询不出数据
  2. 图解实时操作系统和非实时操作系统的区别
  3. cv2绘图 cv.line(),cv.circle(),cv.rectangle(),cv.ellipse(),cv.putText() python
  4. Photoshop 使用钢笔工具 进行抠图 商业出图入门
  5. java 缓存的简单实现
  6. 嵌入式软件面试题整理
  7. 配置多SessionFactory
  8. [xhr4412][extension 4] u-boot-2020.07 DM9621 网卡驱动移植
  9. jmeter脚本录制入门详解
  10. c语言循环题兔子第三个月生,C语言上机习题