003_文本分析与挖掘(Kmeans算法对指定中文数据集聚类)

用Kmeans算法对指定中文数据集聚类:

(1)使用jieba进行分词

(2)去除停用词

(3)构建特征向量

(4)使用Kmeans算法进行聚类

一、分词、去除停用词、构建特征向量

# 具体步骤详见002_文本分析与挖掘

文本如下:

代码展示:

# (1)分词并去除停用词——————————————————————————————————————————————
import jieba

# 读入需要处理的文本
with open ("Dataset.txt", "r", encoding='ANSI') as fp:
    words = fp.read()
    result_text = jieba.lcut(words)
    #print(result_text)

# 读入停用词表,利用jieba分词以列表形式输出
with open ("stopwords_all.txt", "r", encoding='UTF-8') as fs:
    stopwords = fs.read()
    result_stop = jieba.lcut(stopwords)
    #print(result_stop)

new_words = []
for i in result_text:
    if i not in stopwords:
        new_words.append(i)
# print("去除停用词后的结果:", new_words)

#(2)构建特征向量———————————————————————————————————————————————————
from sklearn.feature_extraction.text import TfidfTransformer
from sklearn.feature_extraction.text import CountVectorizer

# 计算TF-IDF
cv = CountVectorizer()
tt = TfidfTransformer()
tv_fit = tt.fit_transform(cv.fit_transform(new_words))

# 获取所有词语特征数量
word = cv.get_feature_names_out()
print("词语特征数量: {}".format(len(word)))

# 导出权重,到这边就实现了将文字向量化的过程,矩阵中的每一行就是一个文档的向量表示
tv_weight = tv_fit.toarray()
print("TF-IDF文档-词矩阵:\n", tv_weight)

#(3)对向量进行聚类———————————————————————————————————————————————————
from sklearn.cluster import KMeans

kmeans = KMeans(n_clusters=4)
kmeans.fit(tv_weight)

labels = kmeans.labels_
centers = kmeans.cluster_centers_

二、可视化

(1)需要将多维数据转化为二维,才能绘图

(2)使用T-SNE算法,对权重和聚类中心进行降维(这里只介绍用到的两个参数)

TSNE(perplexity=30.0, n_components=2)

  • n_components,维度,默认2
  • perplexity,浮点型,预估每个cluster可能有多少个元素,默认30,一般取值在5-50之间

根据可视化图,perplexity参数可自行调节

#(4)可视化———————————————————————————————————————————————————
import matplotlib.pyplot as plt
from sklearn.manifold import TSNE

# 使用T-SNE算法,对权重进行降维
tsne = TSNE(perplexity=30, n_components=2)
words_fit = tsne.fit_transform(tv_weight)

tsne1 = TSNE(perplexity=2, n_components=2)
centers_fit = tsne1.fit_transform(centers)

x = []
y = []
for i in words_fit:
    x.append(i[0])
    y.append(i[1])

a = []
b = []
for i in centers_fit:
    a.append(i[0])
    b.append(i[1])

# ax = plt.axes()
plt.scatter(x, y, c=labels, marker="x")
plt.scatter(a, b, c='red', marker='X', s=200, label='Centroids')

plt.title('K-means Clustering')
plt.xlabel('Feature 1')
plt.ylabel('Feature 2')
plt.legend()
plt.show()

  • 10
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
K-Means算法是一种常见的聚类算法,它可以将数据集划分为K个不同的簇。MNIST数据集是一个手写数字图像集合,包含60000张训练图像和10000张测试图像。 以下是使用K-Means算法对MNIST数据集聚类的步骤: 1. 加载MNIST数据集,并预处理数据 2. 初始化K个聚类中心 3. 计算每个数据点到聚类中心的距离,并将其分配到最近的聚类中心 4. 更新聚类中心的位置,使其成为所分配数据点的平均值 5. 重复步骤3和4直到聚类中心不再变化或达到最大迭代次数 6. 可视化聚类结果,观察聚类效果 以下是代码实现: ```python from sklearn.cluster import KMeans from sklearn import datasets import matplotlib.pyplot as plt import numpy as np # 加载数据集 digits = datasets.load_digits() X = digits.data y = digits.target # 初始化K值 k = 10 # 使用K-Means算法进行聚类 kmeans = KMeans(n_clusters=k, random_state=0).fit(X) # 获取聚类结果 labels = kmeans.labels_ # 计算准确率 accuracy = np.sum(labels == y) / float(len(y)) # 可视化聚类结果 fig = plt.figure(figsize=(8, 3)) fig.suptitle('Cluster Center Images', fontsize=14, fontweight='bold') for i in range(k): ax = fig.add_subplot(2, 5, 1 + i) ax.imshow(kmeans.cluster_centers_[i].reshape((8, 8)), cmap=plt.cm.binary) plt.show() print("Accuracy: {0:.1f}%".format(accuracy * 100)) ``` 上述代码中,我们使用了sklearn库中的KMeans算法对MNIST数据集进行聚类聚类的结果可以通过labels获取,准确率可以通过计算聚类结果与真实标签的匹配程度得到。最后,我们使用matplotlib库可视化了聚类中心的图像。 执行上述代码后,我们可以得到聚类效果如下图所示: ![cluster_result](https://img-blog.csdn.net/20180830125118380?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3BhY2tldGJsb2c=) 从图中可以看出,不同的簇中心对应不同的数字,说明聚类效果较好。代码的输出结果为:Accuracy: 79.9%。这个准确率并不是很高,这是因为MNIST数据集中存在一些难以区分的数字,例如0和6,1和7等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值