计划写一下本学期选修的《机器学习与商业数据挖掘》课程的一系列实战笔记,本篇是第四节课的内容——聚类。

聚类

聚类分析(cluster analysis)是常见的数据挖掘手段,其主要假设是数据间存在相似性,数据集合之间存在差异性。而相似性是有价值的,因此可以被用于探索数据中的特性以产生价值。

聚类是一种无监督的算法,输入一段未被标记的数据,聚类通过使组内距离最小+组间距离最大实现组的划分。

kmeans算法

•事先定义数据要分为几类(K)

•两个原则:每个cluster的中心是这个cluster所有点平均值、每个点距离其自身cluster内的中心的距离比别的cluster中心的距离要近

•数学定义:

算法思路:

•先随机几个初始点为中心点。

•然后遍历所有点,所有点都找到各自的nearest central point。

•重新计算中心点的位置。

•迭代进行。

因此我们注意!

•K-means 可能到不了全局最优点(局部最优)

•必须事先指定有多少类

•K-means 是线性划分

实战

目标:数据挖掘验证《红楼》前八十回,后四十回以及《史记》三者的差别

输入:红楼梦txt,史记十二本纪txt

算法思路:1.特征提取。2.向量化。3.kmeans聚类

TF-IDF:一种统计方法,用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度。字词的重要性随着它在文件中出现的次数成正比增加,但同时会随着它在语料库中出现的频率成反比下降。(百科)

K-means算法:是很典型的基于距离的聚类算法,采用距离作为相似性的评价指标,即认为两个对象的距离越近,其相似度就越大。该算法认为簇是由距离靠近的对象组成的,因此把得到紧凑且独立的簇作为最终目标。(百科)

1.特征提取与向量化

# coding=utf-8

import re

import jieba

import jieba.posseg

import jieba.analyse

import numpy as np

import scipy as sp

import pandas as pd

import matplotlib.pyplot as plt

from sklearn import feature_extraction

from sklearn.cluster import KMeans

from sklearn.feature_extraction.text import TfidfTransformer

from sklearn.feature_extraction.text import CountVectorizer

from sklearn.decomposition import PCA

from sklearn.metrics import accuracy_score

from scipy.stats import mode # 本课程的重要package

# 数据预处理操作:分词,词性筛选

def dataPrepos(text):

l = []

# 定义选取词的词性为:动词、形容词、副词、介词、连词、助词、叹词、临时词

pos = ['v', 'a', 'd', 'p', 'c', 'u', 'e', 'l']

seg = jieba.posseg.cut(text) # 分词

for i in seg:

if i.word not in l and i.flag in pos: # 去重 + 词性筛选

# print i.word

l.append(i.word)

return l

def add_to_dict(characters_names):

for name in names:

jieba.add_word(name) # 把人名输入jieba词汇表

# 将红楼梦的章节分隔成不同的字符串并分别储存,使用前请先排除文档中出现的第某回的干扰

def chapsplit(text):

corpus = [] # 将所有文档输出到一个list中,一行就是一个文档

reg = "第[一二三四五六七八九十百]+回"

txt = re.split(reg, text)

txt = [i for i in txt if len(i) > 200]

for i in range(120):

text = dataPrepos(txt[i]) # 文本预处理

text = " ".join(text) # 连接成字符串,空格分隔

corpus.append(text)

return corpus

# tf-idf获取文本词汇的weight

def tfidf(corpus):

# 1、构建词频矩阵,将文本中的词语转换成词频矩阵

vectorizer = CountVectorizer()

X = vectorizer.fit_transform(corpus) # 词频矩阵,a[i][j]:表示j词在第i个文本中的词频

# 2、统计每个词的tf-idf权值

transformer = TfidfTransformer()

tfidf = transformer.fit_transform(X)

# 3、获取词袋模型中的关键词

word = vectorizer.get_feature_names()

# 4、获取tf-idf矩阵,a[i][j]表示j词在i篇文本中的tf-idf权重

weight = tfidf.toarray()

return weight

if __name__ == "__main__":

with open('高祖本纪.txt', encoding="utf-8") as f:

text = [f.read()]

with open('吕太后本纪.txt', encoding="utf-8") as f:

text = [f.read()]+text

with open('秦本纪.txt', encoding="utf-8") as f:

text = [f.read()]+text

with open('秦始皇本纪.txt', encoding="utf-8") as f:

text = [f.read()]+text

with open('五帝本纪.txt', encoding="utf-8") as f:

text = [f.read()]+text

with open('夏本纪.txt', encoding="utf-8") as f:

text = [f.read()]+text

with open('周本纪.txt', encoding="utf-8") as f:

text = [f.read()]+text

with open('殷本纪.txt', encoding="utf-8") as f:

text = [f.read()]+text

with open('孝文本纪.txt', encoding="utf-8") as f:

text = [f.read()]+text

with open('孝武本纪.txt', encoding="utf-8") as f:

text = [f.read()]+text

with open('孝景本纪.txt', encoding="utf-8") as f:

text = [f.read()]+text

with open('项羽本纪.txt', encoding="utf-8") as f:

text = [f.read()]+text

totalcorpus = [] # 将所有文档输出到一个list中,一行就是一个文档

for i in range(12):

text1 = dataPrepos(text[i]) # 文本预处理

text1 = " ".join(text1) # 连接成字符串,空格分隔

totalcorpus.append(text1)

with open('StoneStory.txt', encoding="utf-8") as f:

text = f.read()

with open('names.txt', encoding="utf-8") as f:

names = [line.strip('\n')

for line in f.readlines()] # 去除换行符

for name in names:

jieba.add_word(name) # 把人名输入jieba词汇表

totalcorpus = chapsplit(text)+totalcorpus # 章节分隔后并合并史记和红楼梦

weight = tfidf(totalcorpus)

具体算法思路不一一讲解,值得讨论的是几个小的处理。

1. 目前,用于文本关键词提取的主要方法有四种:基于TF-IDF的关键词抽取、基于TextRank的关键词抽取、基于Word2Vec词聚类的关键词抽取,以及多种算法相融合的关键词抽取。笔者最开始选择的是Word2vec的方法。但是在写代码的过程中发觉从词向量化向文章向量化的转化处理方法较为复杂且多样,诸如对文章中所有词的word vector求平均,获得sentence embedding等等,鉴于作用时间有限......于是还是选择了常用的tfidf的算法。

2.不去停用词:代码的思路是调用红楼的动词、形容词、副词、介词、连词、助词、叹词、临时词来计算weight,这是因为前后章节的出场人物不同,情节不同,即使是同一个作者来写,最后聚类的结果也很有可能是阳性的,而同一个作者使用的虚词,形容词等词汇,例如的,地,得等。即使情节不同,也不应有较大的差别。

2.PCA降维画画图

# 二维后图像化看一看,好像挺明显了

pca = PCA(2) # 降维到二维

projected = pca.fit_transform(weight)

print(weight.shape)

print(projected.shape)

label = 80*[0]+40*[1]+12*[2] #定义label,分别表示前八十回,后四十回和史记十二篇

plt.figure(facecolor="white")

plt.scatter(projected[:, 0], projected[:, 1],

c=label, edgecolor='none', alpha=1,

cmap=plt.cm.get_cmap('Spectral_r'))

plt.xlabel('component 1')

plt.ylabel('component 2')

plt.colorbar();

# print(pca.explained_variance_)

#output

#(132, 15772)

#(132, 2)未聚类的结果,已经很明显了吧!

紫色的为前八十回,黄色的为后四十回,红色的为史记。

3.kmeans聚类与评价

# kmeans聚类结果

plt.figure(facecolor="white")

labels = KMeans(3, random_state=0).fit_predict(projected) # 聚为三类

plt.scatter(projected[:, 0], projected[:, 1], c=labels,

s=50, cmap='viridis');聚类结果很好

# 假设文本为三类,前八十回,后四十回和史记十二篇

# 对有label的数据可以进行计算accuracy,先按照正确的label对cluster的名字改变

label=np.array(label) #转为array,便于使用mode函数

kmeans = KMeans(n_clusters=3, random_state=0)

clusters = kmeans.fit_predict(projected)

labels = np.zeros_like(clusters)

for i in range(3):

mask = (clusters == i)

labels[mask] = mode(label[mask])[0]

# Compute the accuracy

accuracy_score(label, labels)

#output

#0.9772727272727273

accuracy rate达到了98%,分类非常精准。

结果

红楼后四十回很明显与前八十回不同,这样看来,确系伪作。

讨论

以医学举例,我们也许会好奇那些孩子吃某种药的效果好,哪些孩子吃某种药的效果差。(有label)我们可能有一些让我们能完成分类的特征(也许有好几百维甚至好几千维)。如何能根据这些个体特征来尝试分类,并给出individual treatment,这也许可以尝试聚类的方法。

因为自己也是初学python和机器学习,水平有限,如有代码冗余或者思路错误烦请指出,也欢迎留言交流~

python 降维 聚类_python数据挖掘实战之四:聚类相关推荐

  1. python预测糖尿病_Python数据挖掘 | 实战案例之预测糖尿病

    今天给大家讲解一个实战案例:如何根据现有数据预测糖尿病.在这个案例开始之前,希望大家回忆一下大学里讲过的线性回归的知识,这是数据挖掘里非常重要的一部分知识.当然,鉴于大家都学过,本篇就不再赘述. 一. ...

  2. python数据分类方法_Python数据挖掘—分类—贝叶斯分类

    pandas之get_dummies 方法:pandas.get_dummies(data,prefix=None,prefix_sep="_",dummy_na=False,co ...

  3. python kmeans聚类_python机器学习之k-means聚类算法(1)

    k-means算法是一种无监督的机器学习算法,虽然是机器学习,但它简单易于实现.本篇采用python语言,自主编程实现k-menas算法,当然python用专门的库函数来实现该算法,但本次主要使用该算 ...

  4. python层次聚类_python中做层次聚类,使用scipy.cluster.hierarchy.fclusterdata方法 | 学步园...

    python机器学习包里面的cluster提供了很多聚类 但是没有看明白ward_tree的返回值代表了什么含义,遂决定寻找别的实现方式. 经过查找,发现scipy.cluster.hierarchy ...

  5. python与财务数据挖掘_Python数据挖掘实战2:财政收入影响因素及预测

    Reference <Python数据分析与挖掘实战(第2版)> 第6章,页码:P170,代码略有改进 data.csv数据下载 分析过程 import pandas as pd impo ...

  6. python 三分类的哑编码_python数据挖掘实战 -数据预处理篇(数据可视化-空值填充-哑变量编码)...

    数据预处理包含:数据盘点-数据可视化分析-空值填充-数据编码 import matplotlib.pyplot as plt import seaborn as sns from sklearn.ne ...

  7. python红楼梦绘制词云形状图_python数据挖掘实战笔记——文本挖掘(5):词云美化之绘制《红楼梦》词云图...

    词云图的美化就是把词云图的背景和颜色进行美化,以<红楼梦>词云图为例,如下所示: 首先绘制词云,跟之前的代码操作一样: import jieba import numpy import c ...

  8. python银行开户_Python数据挖掘与Stata应用实证寒假工作坊

    1月25日上午 主讲人:邓旭东 课程安排:python语法入门 1.Python跟英语一样是一种语言 2.数据类型之字符串 3. 数据类型之列表元组集合 4. 数据类型之字典 5.数据类型之布尔值.N ...

  9. 垃圾短信识别python步骤详细_python数据挖掘第三篇-垃圾短信文本分类

    文本分类总体上包括8个步骤.数据探索分析->数据抽取->文本预处理->分词->去除停用词->文本向量化表示->分类器->模型评估.重要python库包括num ...

最新文章

  1. 【CSS实现Loading遮罩】点击按钮,弹出一个DIV层窗口
  2. xgboost 正则项_XGBoos算法背后的数学:尽可能简单地解释XGBoost算法背后的机制
  3. mac升级php7,MAC更新自带php版本到7.0
  4. python flask 基础入门
  5. 【学习笔记】第四章——文件 I(文件管理、逻辑结构、目录与文件分配方式)
  6. Docker02 基本命令、开发环境搭建、docker安装nginx、Dockerfile、路径挂载
  7. SparkSQL: no typetag available for xxxx问题的解决办法
  8. idea中出现Please, configure Web Facet first问题
  9. Android--序列化XML数据
  10. oracle能不能改外键属性,CSS_小议Oracle外键约束修改行为(五), Oracle的外键用来限制子表 - phpStudy...
  11. ROW_NUMBER() OVER()函数用法详解
  12. java最好性能手机_企业级Java应用最重要的4个性能指标
  13. linux怎么定义程序执行有限级别,linux 内核是什么?
  14. 安装包制作工具 SetupFactory 详解
  15. 为什么计算机内存数值存储方式是补码?
  16. 微信3.1.0.58逆向-微信3.1.0.58HOOK接口说明(WeChatHelper.dll)-获取当前聊天微信ID
  17. java 摄像头 视频_javaCV-摄像头实时视频
  18. python对seo有什么用_seo学习python有什么益处
  19. Mac绘图软件:Paint X
  20. 2021年焊工(技师)考试试卷及焊工(技师)多少钱

热门文章

  1. C语言初学者应该知道些什么
  2. 服务器无法重命名 请确定磁盘未满或未被写保护而且文件夹未被使,请确定磁盘未满或未被写保护而且文件未被使用 解决办法...
  3. pandas—数据组合
  4. 【Homeassistant 的Node-red插件之小爱同学语音功能开通】
  5. ucosii任务三要素---执行代码 堆栈 任务控制块
  6. Python爬虫+夜神模拟器+Fiddler抓取手机APP数据接口 -- 图文教程(霸霸看了都说好)
  7. 阿拉擦擦呀 甩葱歌 图铃
  8. 一些PC端的搜索引擎蜘蛛爬虫UA
  9. 操作系统知识如何学?本文带你捋一遍
  10. 互联网晚报 | 董明珠称格力员工一人一套房承诺不变;工信部:自动续费前5日应以显著方式提醒;诺基亚近60年来首次更换新Logo...