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.07.22 洛谷P4316 绿豆蛙的归宿(概率dp)
传送门 简单的递推. 由于是DAG" role="presentation" style="position: relative;">DAGDA ...
- angularjs写公共方法
'use strict'; angular.module('fast-westone') .factory('commonUtilService', function () { return { /* ...
- js获取年月日时分秒星期
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- DataFrame按行读取:DataFrame之values
http://blog.csdn.net/u014607457/article/details/51290582 def fill_core(self): RatingTable=pd.read_cs ...
- “无后端”的web应用开发模式
最近看到前端趋势2013大会上的一篇文章,题目是<各位快看,不用后端>,觉得有点意思,恰好近期的一次讨论及半年前的一次开发实践也涉及到这种模式,简单谈谈我的想法. 不得不说,文章的题目确实 ...
- C/C++的Name Mangling
C语言 函数 1.void __CALLTYPE f();2.int __CALLTYPE f();3.int __CALLTYPE f(int);4.double __CALLTYPE f(int, ...
- 201709020工作日记--synchronized、ReentrantLock、读写锁
1.reentrantLock java.util.concurrent.lock 中的Lock 框架是锁定的一个抽象,它允许把锁定的实现作为 Java 类,而不是作为语言的特性来实现.这就为Lock ...
- (并查集)A Bug's Life -- POJ -- 2492
链接: http://poj.org/problem?id=2492 http://acm.hust.edu.cn/vjudge/contest/view.action?cid=82830#probl ...
- (连通图 Tarjan)Caocao's Bridges --HDU --4738
链接: http://acm.hdu.edu.cn/showproblem.php?pid=4738 题目大意:曹操有很多岛屿,然后呢需要建造一些桥梁将所有的岛屿链接起来,周瑜要做的是就是不让曹操将所 ...
- 我也谈谈.NET程序员工资低
我从2011年下半年预谋转型,2012春季正式转型到iOS,看了<经过本人 6 年.net 工作经验证明 .net 工资确实比 Java 低>这篇文章,一下子有很多感慨. 我不好意思算我干 ...