一般來說,BIRCH演算法適用于樣本量較大的情況,這點和Mini Batch K-Means類似,但是BIRCH適用于類別數比較大的情況,而Mini Batch K-Means一般用于類別數適中或者較少的時候,BIRCH除了聚類還可以額外做一些例外點檢測和資料初步按類別規約的預處理,但是如果資料特征的維度非常大,比如大于20,則BIRCH不太適合,此時Mini Batch K-Means的表現較好,
資料格式: test.dat
新春 備 年貨 , 新年 聯歡晚會
新春 節目單 , 春節 聯歡晚會 紅火
大盤 下跌 股市 散戶
下跌 股市 賺錢
金猴 新春 紅火 新年
新車 新年 年貨 新春
股市 反彈 下跌
股市 散戶 賺錢
新年 , 看 春節 聯歡晚會
大盤 下跌 散戶
程式代碼:
# coding=utf-8
import sys
import jieba
import numpy as np
from sklearn import feature_extraction
from sklearn.feature_extraction.text import TfidfTransformer
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.cluster import Birch
import importlib
importlib.reload(sys)
class Cluster():
def init_data(self):
corpus = []
self.title_dict = {}
with open('test.dat', 'r' ,encoding="utf-8") as f:
index = 0
for line in f:
title = line.strip()
self.title_dict[index] = title
seglist = jieba.cut(title,cut_all=False) #精確模式
output = ' '.join(['%s'%x for x in list(seglist)]).encode('utf-8') #空格拼接
# print index,output
index +=1
corpus.append(output.strip())
#將文本中的詞語轉換為詞頻矩陣 矩陣元素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權重
self.weight = tfidf.toarray()
# print self.weight
def birch_cluster(self):
print ('start cluster Birch -------------------' )
self.cluster = Birch(threshold=0.8,n_clusters=5)
self.cluster.fit_predict(self.weight)
def get_title(self):
# self.cluster.labels_ 為聚類后corpus中文本index 對應 類別 {index: 類別} 類別值int值 相同值代表同一類
cluster_dict = {}
# cluster_dict key為Birch聚類后的每個類,value為 title對應的index
for index,value in enumerate(self.cluster.labels_):
if value not in cluster_dict:
cluster_dict[value] = [index]
else:
cluster_dict[value].append(index)
print(cluster_dict)
print ("-----before cluster Birch count title:",len(self.title_dict))
# result_dict key為Birch聚類后距離中心點最近的title,value為sum_similar求和
result_dict = {}
for indexs in cluster_dict.values():
latest_index = indexs[0]
similar_num = len(indexs)
if len(indexs)>=2:
min_s = np.sqrt(np.sum(np.square(self.weight[indexs[0]]-self.cluster.subcluster_centers_[self.cluster.labels_[indexs[0]]])))
for index in indexs:
s = np.sqrt(np.sum(np.square(self.weight[index]-self.cluster.subcluster_centers_[self.cluster.labels_[index]])))
if s<min_s:
min_s = s
latest_index = index
title = self.title_dict[latest_index]
result_dict[title] = similar_num
print ("-----after cluster Birch count title:",len(result_dict))
for title in result_dict:
print(title,result_dict[title])
return result_dict
def run(self):
self.init_data()
self.birch_cluster()
self.get_title()
if __name__=='__main__':
cluster = Cluster()
cluster.run()
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/248601.html
標籤:python
上一篇:python工具系列-弱口令工具
