聚类算法(七)—— Kmeans(含标签聚类和文本聚类代码)

聚类算法相关:

聚类算法(一)——DBSCAN

聚类算法(二)—— 优缺点对比

聚类算法(三)—— 评测方法1

聚类算法(三)—— 评测方法2

聚类算法(三)—— 评测方法3(代码)

聚类算法(四)—— 基于词语相似度的聚类算法(含代码)

聚类算法(五)——层次聚类 linkage (含代码)

聚类算法(六)——谱聚类 (含代码)

 

 

写了那么多聚类文章,没写Kmeans感觉不太厚道, 但是相对来说目前Kmeans介绍的博文很多,相对来说逻辑也比较简单,所以这里我贴一篇个人感觉写的比较好的Kmeans介绍,供大家参考 

K-Means聚类算法原理

步骤

步骤粘过来:

 

代码

顺便上个我写的KMeans的代码:

from sklearn.cluster import KMeans

# 加载word2vec模型
model_file = '' # word2vec model
model = gensim.models.Word2Vec.load(model_file)

words = ['', '', ''] # 这里写要聚类的词语

X = [model[x] for x in words]
kmeans_model = KMeans(n_clusters=cluster_number, init='k-means++', random_state=1).fit(X)
labels = kmeans_model.labels_

将model_file 填上word2vec词向量模型, words输入要聚类的词语即可。 word2vec词向量训练可以参考 文本表示(二)—— word2vec 词向量训练代码

解释下, NLP方面做的聚类多是针对文本的,如果是对数值相关的特征进行聚类操作,可以直接不加word2vec查询词向量这一步,或者可以从网上搜一些其他的例子,数值聚类的有很多。

下面我来介绍一下针对文本聚类的操作,举的例子是针对词的,这里例子只是简单的对词语聚类,当然如果要对短语或者是句子聚类是需要调整输入的X特征的,详细可以参见 聚类算法(四)—— 基于词语相似度的聚类算法(含代码)代码的相似度部分,有相关的代码示例。

上面代码中,通过word2vec模型查着对应词语的词向量表示,作为输入的特征,进一步送到KMeans模型进行聚类。

还要说的一点是, 这里选用了KMeans++, 很多情况下比KMeans效果要好一些,聚类算法(二)—— 优缺点对比  优缺点对比中我们可以看到, KMeans的其中一个缺点是初始化中心点的选择问题,这个也是KMeans和EM都具有的问题,不同的初始化会导致结果不同,可能导致局部收敛,为了避免这个问题,K-Means++K-Means随机初始化质心的方法进行了优化,质心选择的阶段,对每个非已选取质心点,判断其距离已选取质心距离的最小值,选择这些非质心点中这个最小值最大的点作为新添加的质心点。详细可参考:K-Means聚类算法原理     参考下一章内容

 

方法二:

如果说我没有数据训练词向量,且也没有一个现成的词向量,或者我就懒得训练一个词向量怎么办呢?

这里给一个适用于文本的tfidf的方案:

from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.cluster import KMeans
import jieba

def segment(x):
    segments = jieba.cut(str(x))
    return " ".join(segments)

texts = ['','',''] # 句子序列
seg_texts = [segment(x) for x in texts]

tfvec = TfidfVectorizer()
model = KMeans(n_clusters=k, init='k-means++', random_state=9)
cv_fit = self.tfvec.fit_transform(seg_texts).toarray()
y_pred = model.fit_predict(cv_fit)

这里再多说一句, 上面贴的两块代码,可以适用于很多文本聚类的算法,将KMeans进行替换即可。

 

KMeans++

这里有一篇说的很好的,贴过来  KMeans - 概述

写下KMeans++逻辑:

其实说的有点绕,直白点说,就是先随机给一个中心点,剩下的挨个选,选的逻辑是找与当前中心点最远的点,但是不直接把距离当前已有中心点s 最远的点作为新的中心点,而是给其他的点各附一个概率,概率正比于 距已有中心点的距离,就还是越远概率越高,但是随机给一个概率就可以避免离群噪声点的影响,而将更集中一起的一个簇中的点更可能被找到(为什么,因为簇里面点比较多,概率乘以m,那就比离群点的概率要大了,就是我一群一面选一个跟离群点自己被选中比,肯定更有优势)

  • 2
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
Kmeans聚类算法是一种无监督学习算法,用于将数据集划分为不同的簇。它是一个迭代算法,通过计算每个数据点与簇中心的距离,将数据点分配到最近的簇中心。然后,根据分配的数据点更新簇中心。重复这个过程,直到簇中心不再变化或达到预设的迭代次数。 下面是一个使用Python实现Kmeans聚类算法的示例: ``` python import numpy as np import matplotlib.pyplot as plt # 生成随机数据 np.random.seed(0) X = np.random.randn(100, 2) # 初始化K个簇中心 K = 3 centers = X[np.random.choice(len(X), K, replace=False)] # 迭代聚类 for i in range(10): # 计算每个数据点最近的簇中心 distances = np.linalg.norm(X[:, np.newaxis, :] - centers, axis=2) labels = np.argmin(distances, axis=1) # 更新簇中心 for k in range(K): centers[k] = np.mean(X[labels == k], axis=0) # 可视化聚类结果 colors = ['r', 'g', 'b'] for k in range(K): plt.scatter(X[labels == k, 0], X[labels == k, 1], c=colors[k]) plt.scatter(centers[:, 0], centers[:, 1], marker='*', s=200, c='#050505') plt.show() ``` 在这个例子中,我们生成了一个随机数据集,然后初始化了3个簇中心。然后,我们执行10次迭代,计算每个数据点最近的簇中心,并根据分配的数据点更新簇中心。最后,我们可视化聚类结果,其中每个簇用不同的颜色表示,簇中心用星号表示。 Kmeans聚类算法是一种简单有效的聚类算法,但它有一些缺点。例如,它需要预先指定簇的数量K,这可能不是很容易确定。此外,它对初始簇中心的选择很敏感,可能会导致陷入局部最优解。因此,在实际应用中,需要对它进行改进,例如Kmeans++算法和层次聚类算法等。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

微知girl

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值