kmeans DBSCAN LDA聚类 TSNE对聚类效果进行可视化展示
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中每一个向量所对应的聚类类别。
上一篇: php二维数组根据某个字段排序
下一篇: ModelAndView