python聚类算法实战详细笔记 (python3.6+(win10、Linux))
python聚类算法实战详细笔记 (python3.6+(win10、Linux))
一、基本概念:
1、计算TF-DIF
TF-IDF是一种统计方法,用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度。
字词的重要性随着它在文件中出现的次数成正比增加,但同时会随着它在语料库中出现的频率成反比下降。
TFIDF的主要思想是:如果某个词或短语在一篇文章中出现的频率TF高,并且在其他文章中很少出现,
则认为此词或者短语具有很好的类别区分能力,适合用来分类。TFIDF实际上是:TF * IDF,TF词频(Term Frequency),
IDF逆向文件频率(Inverse Document Frequency)。TF表示词条在文档d中出现的频率。
IDF的主要思想是:如果包含词条t的文档越少,也就是n越小,IDF越大,则说明词条t具有很好的类别区分能力。
2、K-means聚类计算
K-means算法是硬聚类算法,是典型的基于原型的目标函数聚类方法的代表,
它是数据点到原型的某种距离作为优化的目标函数,利用函数求极值的方法得到迭代运算的调整规则。
K-means算法以欧式距离作为相似度测度,它是求对应某一初始聚类中心向量V最优分类,使得评价指标J最小。
算法采用误差平方和准则函数作为聚类准则函数。
二、python3.5 3.6环境配置
1、安装了VS2015;
2、在Python3.5安装路径中有一个Scripts文件夹,里面有pip.exe或者类似的可执行文件,安装一下;
3、下载相对应的whl安装包,下载地址http://www.lfd.uci.edu/~gohlke/pythonlibs/;
下载:1)numpy-1.12.1+mkl-cp36-cp36m-win32.whl
2)scipy-0.19.0-cp36-cp36m-win32.whl
3)scikit_learn-0.18.1-cp36-cp36m-win32.whl
4、安装, 下载好以后,进入whl文件所在文件夹,进入cmd,输入命令:
1)pip install numpy-1.12.1+mkl-cp36-cp36m-win32.whl 回车;显示successful,不要关闭cmd;
2)pip install scipy-0.19.0-cp36-cp36m-win32.whl 回车;显示successful,不要关闭cmd;
3)pip install scikit_learn-0.18.1-cp36-cp36m-win32.whl 回车;显示successful,不要关闭cmd;
5、验证一下,输入命令: 输入import numpy 回车 无异常,输入import scipy 回车 无异常,输入import sklearn 回车 无异常
环境配置成功
三、文本聚类算法步骤
本次目标是对海量淘宝商品标题进行分类
1、准备数据(5000条淘宝商品标题)
a、采集
b、手工准备
范本:https://pan.baidu.com/s/1eR4V77W (标题原文5000行【文本文件】)
2、初步加工
a、中文分词
b、手工处理
范本:https://pan.baidu.com/s/1mi4Z9wO (分词后的标题5000行【文本文件】)
3、计算TF-IDF代码如下:
代码如下:
============================tfidf.py begin====================================================
# coding=utf-8
import time
import re
import os
import sys
import codecs
import shutil
from sklearn import feature_extraction
from sklearn.feature_extraction.text import TfidfTransformer
from sklearn.feature_extraction.text import CountVectorizer
if __name__ == "__main__":
corpus = [] #文档预料 空格连接
#读取预料 一行预料为一个文档
aa = 0
for line in open('D:/pyfenlei/5000/p1.txt', 'r').readlines():
# print (line)
# print(aa)
aa = aa +1
if (line.strip()):
corpus.append(line.strip())
#print corpus
time.sleep(5)
#将文本中的词语转换为词频矩阵 矩阵元素a[i][j] 表示j词在i类文本下的词频
vectorizer = CountVectorizer()
#该类会统计每个词语的tf-idf权值
transformer = TfidfTransformer()
#第一个fit_transform是计算tf-idf 第二个fit_transform是将文本转为词频矩阵
tfidf = transformer.fit_transform(vectorizer.fit_transform(corpus))
#获取词袋模型中的所有词语
word = vectorizer.get_feature_names()
#将tf-idf矩阵抽取出来,元素w[i][j]表示j词在i类文本中的tf-idf权重
weight = tfidf.toarray()
resName = "D:/pyfenlei/5000/p1.tfidf"
result = codecs.open(resName, 'w', 'utf-8')
for j in range(len(word)):
result.write(word[j] + ' ')
result.write('\r\n\r\n')
#打印每类文本的tf-idf词语权重,第一个for遍历所有文本,第二个for便利某一类文本下的词语权重
for i in range(len(weight)):
print ("-------这里输出第",i,u"类文本的词语tf-idf权重------")
for j in range(len(word)):
result.write(str(weight[i][j]) + ' ')
result.write('\r\n\r\n')
result.close()
============================tfidf.py end======================================================
计算结果:https://pan.baidu.com/s/1nuOujgP (TF-IDF权重值5000行【文本文件】)
4、计算K-means代码如下(暂定聚40个类):
代码如下:
============================Kmeans.py begin===================================================
# coding=utf-8
"""
#K-means
"""
import time
import re
import os
import sys
import codecs
import shutil
import numpy as np
from sklearn import feature_extraction
from sklearn.feature_extraction.text import TfidfTransformer
from sklearn.feature_extraction.text import CountVectorizer
if __name__ == "__main__":
corpus = []
#读取预料 一行预料为一个文档
for line in open('D:/pyfenlei/5000/p1.txt', 'r').readlines():
# print (line)
corpus.append(line.strip())
#print corpus
#time.sleep(1)
#将文本中的词语转换为词频矩阵 矩阵元素a[i][j] 表示j词在i类文本下的词频
vectorizer = CountVectorizer()
#该类会统计每个词语的tf-idf权值
transformer = TfidfTransformer()
#第一个fit_transform是计算tf-idf 第二个fit_transform是将文本转为词频矩阵
tfidf = transformer.fit_transform(vectorizer.fit_transform(corpus))
#获取词袋模型中的所有词语
word = vectorizer.get_feature_names()
#将tf-idf矩阵抽取出来,元素w[i][j]表示j词在i类文本中的tf-idf权重
weight = tfidf.toarray()
from sklearn.cluster import KMeans
clf = KMeans(n_clusters=40)
s = clf.fit(weight)
kmName = "D:/pyfenlei/5000/p1.km"
kmresult = codecs.open(kmName, 'w', 'utf-8')
i = 1
while i <= len(clf.labels_):
kmresult.write("%d,%d\n" % (i, clf.labels_[i-1]))
i = i + 1
kmresult.close()
#用来评估簇的个数是否合适,距离越小说明簇分的越好,选取临界点的簇个数
print(clf.inertia_)
============================Kmeans.py end===================================================
计算结果:https://pan.baidu.com/s/1skR9P7J (K-means标题行与分类簇号共5000行【文本文件】)
5、标题归类如下:
代码如下:
============================btgl.py begin===================================================
# coding=utf-8
"""
#标题归类
"""
import time
import re
import os
import sys
import codecs
if __name__ == "__main__":
ywName = "D:/pyfenlei/5000/p1.yw"
kmName = "D:/pyfenlei/5000/p1.km"
ywList = [line.strip() for line in open(
ywName, encoding='utf-8').readlines()]
kmList = [line.strip().split(',')[1].strip()
for line in open(kmName, encoding='utf-8').readlines()]
for i in range(len(kmList)):
btglName = "D:/pyfenlei/gl/p1_%s.btgl"
btglresult = codecs.open(btglName % (kmList[i]), 'a', 'utf-8')
btglresult.write("%s\n" % (ywList[i]))
btglresult.close()
print("标题归类完毕!")
============================btgl.py end==================================================
计算结果:https://pan.baidu.com/s/1sl2N7Tr (40个聚类对应的标题归并后的40个标题列表文件【文本文件】)
6、词群归类如下:
代码如下:
============================cqgl.py begin================================================
# coding=utf-8
"""
#标题归类
"""
import time
import re
import os
import sys
import codecs
if __name__ == "__main__":
fcName = "D:/pyfenlei/5000/p1.txt"
kmName = "D:/pyfenlei/5000/p1.km"
fcList = [line.strip() for line in open(
fcName, encoding='utf-8').readlines()]
kmList = [line.strip().split(',')[1].strip()
for line in open(kmName, encoding='utf-8').readlines()]
for i in range(len(kmList)):
cqglName = "D:/pyfenlei/gl/p1_%s.cqgl"
cqglresult = codecs.open(cqglName % (kmList[i]), 'a', 'utf-8')
cqglresult.write("%s " % (fcList[i]))
cqglresult.close()
print("词群归类完毕!")
============================cqgl.py end===================================================
计算结果:https://pan.baidu.com/s/1pL6p0ev (40个聚类对应的分词归并后的40个词群【文本文件】)
代码没有进行整合,也不具备大规模聚类,仅供参考!
参考资料:
https://sourceforge.net/projects/scipy/files/scipy/
https://github.com/scipy/scipy/releases
https://pypi.python.org/pypi/scipy (这里的scipy好像很难安装成功)
http://www.lfd.uci.edu/~gohlke/pythonlibs/ (这里有scipy的各种版本)
本人原创未经许可,可以随意转载!
python聚类算法实战详细笔记 (python3.6+(win10、Linux))的更多相关文章
- Python聚类算法之基本K均值实例详解
Python聚类算法之基本K均值实例详解 本文实例讲述了Python聚类算法之基本K均值运算技巧.分享给大家供大家参考,具体如下: 基本K均值 :选择 K 个初始质心,其中 K 是用户指定的参数,即所 ...
- python聚类算法解决方案(rest接口/mpp数据库/json数据/下载图片及数据)
1. 场景描述 一直做java,因项目原因,需要封装一些经典的算法到平台上去,就一边学习python,一边网上寻找经典算法代码,今天介绍下经典的K-means聚类算法,算法原理就不介绍了,只从代码层面 ...
- Linux实战教学笔记08:Linux 文件的属性(上半部分)
第八节 Linux 文件的属性(上半部分) 标签(空格分隔):Linux实战教学笔记 第1章 Linux中的文件 1.1 文件属性概述(ls -lhi) linux里一切皆文件 Linux系统中的文件 ...
- Linux实战教学笔记
Linux实战教学笔记01:计算机硬件组成与基本原理 Linux实战教学笔记02:计算机系统硬件核心知识 Linux实战教学笔记03:操作系统发展历程及系统版本选择 Linux实战教学笔记04:Lin ...
- python相关性算法解决方案(rest/数据库/json/下载)
1. 场景描述 一直做java,因项目原因,需要封装一些经典的算法到平台上去,就一边学习python,一边网上寻找经典算法代码,今天介绍下经典的相关性算法,算法原理就不介绍了,只从代码层面进行介绍,包 ...
- 机器学习实战(Machine Learning in Action)学习笔记————06.k-均值聚类算法(kMeans)学习笔记
机器学习实战(Machine Learning in Action)学习笔记————06.k-均值聚类算法(kMeans)学习笔记 关键字:k-均值.kMeans.聚类.非监督学习作者:米仓山下时间: ...
- 【Python机器学习实战】聚类算法(1)——K-Means聚类
实战部分主要针对某一具体算法对其原理进行较为详细的介绍,然后进行简单地实现(可能对算法性能考虑欠缺),这一部分主要介绍一些常见的一些聚类算法. K-means聚类算法 0.聚类算法算法简介 聚类算法算 ...
- 【Python机器学习实战】聚类算法(2)——层次聚类(HAC)和DBSCAN
层次聚类和DBSCAN 前面说到K-means聚类算法,K-Means聚类是一种分散性聚类算法,本节主要是基于数据结构的聚类算法--层次聚类和基于密度的聚类算法--DBSCAN两种算法. 1.层次聚类 ...
- Python—kmeans算法学习笔记
一. 什么是聚类 聚类简单的说就是要把一个文档集合根据文档的相似性把文档分成若干类,但是究竟分成多少类,这个要取决于文档集合里文档自身的性质.下面这个图就是一个简单的例子,我们可以把不同的文档聚合 ...
随机推荐
- 2018.08.27 lucky(模拟)
描述 Ly 喜欢幸运数字,众所周知,幸运数字就是数字位上只有 4 和 7 的数字. 但是本题的幸运序列和幸运数字完全没关系,就是一个非常非常普通的序列. 哈哈,是 不是感觉被耍了,没错,你就是被耍了. ...
- AE(ArcEngine)定制工具Tool工具箱
using System; using System.Collections.Generic; using System.Text; using System.Runtime.InteropServi ...
- SharpMap源代码解析
1. 简介 SharpMap是基于.net2.0的GIS系统.支持多种.NET开发语言(C# C++ 等).使用属性数据作为注记.符合OpenGIS的简单要素规范(OpenGIS Simple Fea ...
- hibernate的一级缓存问题
1.证明一级缓存的问题 输出结果: 只发出一条查询语句 第二条查询语句没有执行 因为第一条查询语句缓存的存在 2. 移除缓存: 输出结果: 3.一级缓存的快照 就是对一级缓存的数据备份 保证数据库的 ...
- EntityFramework 基本模式和Code-First的简单使用
1.Database-First Database First就是首先建立好数据库,或者存在现成的数据库也可以.然后在vs中添加ADO.Net实体数据模型,找到需要的数据库和表.它是以数据库设计为基 ...
- Oracle SQL Trace 和 10046 事件
http://blog.csdn.net/tianlesoftware/article/details/5857023 一. SQL_TRACE 当SQL语句出现性能问题时,我们可以用SQL_TRAC ...
- Delphi for iOS开发指南(7):在iOS应用程序中使用WebBrowser组件
Delphi for iOS开发指南(7):在iOS应用程序中使用WebBrowser组件 在FireMonkey iOS应用程序中使用WebBrowser 在iOS平台上,FireMonkey使用T ...
- ASP.NET MVC 使 Controller 的 Action 只接受 Ajax 请求。
首先,ajax 请求跟一般的 web 请求本质是相同的,都是 http 请求.理论上服务器端是无法区分该次请求是不是 ajax 请求的,但是,既然标题都已经说了,那么肯定是有办法做的. 在 ajax ...
- Git安全配置
今天收到了阿里云异地登录的短信报警,登录阿里云后台发现,有人从深圳登录了我的服务器(本人在北京),查看详细信息一共登录了5次,前两次是使用的git用户进行登录,后两次已经变成了root用户,怀疑是 ...
- TFS支持移动设备,微软已经走出了第一步(手机上更新、查询工作项)
TFS支持移动设备,微软已经走出了第一步! 从现在开始,你可以在手机浏览器上打开自己的VSTS团队项目,会看大手机版的工作项界面,你可以在手机设备上更新.查询工作项. 这是原生自带的,这些移动功能马上 ...