欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

kmeans DBSCAN LDA聚类 TSNE对聚类效果进行可视化展示

程序员文章站 2022-03-05 08:09:47
...

kmeans DBSCAN LDA聚类 TSNE对聚类效果进行可视化展示

对代码进行记录,方便以后使用

kmeans聚类代码

from sklearn.cluster import KMeans
km_cluster = KMeans(n_clusters=3, max_iter=300, n_init=40,init='k-means++', n_jobs=-1)
result = km_cluster.fit_predict(data)#对句子进行聚类时,data是一个二维的nparray,每个内层的nparray代表每个句子的语义向量,示例  data = np.array([[1.12486,-2.1483,0.1482],[-0.1473,-1.2564,3.1452]])

参数备注:
1)n_clusters:聚类类别数,人为指定
2)max_iter:迭代次数
3)n_jobs:进程数量,值为-1时代表线程全开
4)result:每一个句子的聚类结果标签,数据类型为np.array,假如对句子1,句子2,句子3进行聚类,句子1和句子2是一类,句子3单独是一类,则result的值为[0,0,1]

DBSCAN聚类代码

import numpy as np  # 数据结构
import sklearn.cluster as skc  # 密度聚类
from sklearn import metrics  # 评估模型
result = skc.DBSCAN(eps=1.5, min_samples=3).fit(data)#对句子进行聚类时,data是一个二维的nparray,每个内层的nparray代表每个句子的语义向量,示例  data = np.array([[1.12486,-2.1483,0.1482],[-0.1473,-1.2564,3.1452]])
labels = result.labels_.tolist()

备注:
1)DBSCAN与kmeans不同的是,Kemans可以预先指定聚类类别,而DBSCAN不可以

2)labels代表每个句子聚类的类别标签,数据类型为np.array,假如对句子1,句子2,句子3进行聚类,句子1和句子2是一类,句子3单独是一类,则result的值为[0,0,1]

LDA聚类代码

from sklearn.feature_extraction.text import CountVectorizer
from sklearn.decomposition import LatentDirichletAllocation
import jieba
import numpy as np
#使用LDA对文档中的多个句子进行聚类

#读文件分词
with open(filepath,'r') as rf:
    lines = rf.readlines()
split_words = []
for line in lines:
    words = jieba.lcut(line)
    split_words.append(' '.join(words))#split_words用于训练LDA模型,其数据格式为列表,详细情况见备注1)
    
#构造词频向量
vectorizer = CountVectorizer()
vec_ft = vectorizer.fit_transform(split_words)#见备注2)

#创建LDA对象
lda = LatentDirichletAllocation(n_components=3, learning_offset=50, random_state=0,n_jobs=-1,max_iter=1000)
#训练LDA模型,得到聚类结果
lda_result = lda.fit_transform(vec_ft)

备注
1)split_words。如果是对多个句子进行聚类,则列表中的每一个元素为:每个句子分词以后,以空格作为连接符将所有词汇拼接起来,形成一个字符串,以“我喜欢吃苹果”和“今天晴天”两个句子为例,split_words中的数据为[‘我 喜欢 吃 苹果’,‘今天 晴天’],若是对文档进行聚类,则将示例中的句子转换成文档

2)vec_ft。其数据类型为scipy.sparse.csr.csr_matrix 使用vec_ft.toarray()可得到二维的np.array,其中每一个内层的array代表每一个句子的向量

3)lda_result。聚类结果,同样是一个二维的np.array,每一个内层的array代表每一个句子分别属于哪一类的概率,将概率大的类别作为该句子所属类别,例如对三个句子进行聚类,且聚类类别为2,lda_result的结果是[[0.1,0.7],[0.4,0.6],[0.2,0.8]],则三个句子的聚类类别标签分别为2,1,1

TSNE对聚类效果进行可视化展示代码

import numpy as np
import matplotlib.pyplot as plt
from sklearn.manifold import TSNE
vec = np.array([0.1457,0.2496,0.3548],[0.1259,0.1473,0.2846],[5.1478,5.2896,6.2484])#见备注1)
target = np.array([0,0,1])#见备注2)

tsne = TSNE(n_components = 2,init = 'pca',random_state = 0,n_jobs = -1)
output = tsne.fit_transform(vec)
plt.rcParam['figure.figsize'] = 20,20#画布大小
plt.scatter(output[:,0],output[:,1],c=target)
plt.title('cluster result')
plt.save(filepath,bbox_inches = 'tight')
plt.show()

备注:
1)vec。数据类型为二维的np.array,其中每一个内层的array代表每一个句子的向量,也就是输入到kmeans,DBSCAN,LDA等聚类模型中的向量

2)target。数据类型为一维的np.array,其中每一个元素为vec中每一个向量所对应的聚类类别。

相关标签: 经验总结