K Means牛刀小試之文件聚類

2021-10-08 03:46:11 字數 3675 閱讀 8661

:本文中介紹的tfidf矩陣,余弦距離計算等概念倘若有不清晰的,可以先去看看博主的前一篇文章:利用余弦距離比較文件間的相似度

對於最初的k個中心結點的選取,採用的是隨機選取的方式,首先是定義乙個索引列表,然後根據文件的數量來生成隨機數,當隨機生成的索引不在索引列表中時將其新增到索引陣列中去直至找齊k個中心結點的索引為止,然後利用索引去文件中找出對應的k個中心點,**實現如下:

def

randpick

(k,matrix)

:"""

k:k-means演算法的k值

matrix:文件對應的tfidf矩陣

返回的是對應中心點

"""index,docnums =

,matrix.shape[0]

random.seed(1)

while index ==

orlen

(index)

< k:

idx= random.randint(

0,docnums -1)

if idx not

in index:

return matrix[index]

對於中心點與各文件間的"距離"計算公式本文採用的余弦距離,當然你也可以採取其他的距離計算方式。

對於本專案,k-means收斂方式有很多種:

本專案最終選取的方案是:k個簇的中心點不再改變

對於文件到k個中心點的距離計算採用的是余弦距離,為了提公升運算速度使用了numpy矩陣運算。

首先,將k個中心點構造成乙個中心點矩陣,其結構如下圖所示:

在中心點矩陣中,每行代表乙個中心點,總行數為k表示共有k個中心點。

文件矩陣即為文件的tfidf矩陣,具體介紹詳解本文開頭鏈結文章,為了方便理解後面的距離計算過程,同樣將其結構展示如下:

設中心點矩陣為c

cc,其維度為k×n

knk×

n,文件矩陣為d

dd,其維度為m×n

mnm×

n(m為文件數),因此中心點與文件的距離計算公式如下:

d is

=c∙d

tdis = cd^\mathrm t

dis=c∙

dt最後計算出的距離矩陣維度為k×m

kmk×

m,其結構見下圖:

由圖我們可以清楚的看到,在該距離矩陣中,每一行代表了m

mm個文件到該行對應的中心點的距離。

def

getcosinedistance

(seeds,docmatrix)

:"""

計算中心點與各個文件間的距離

seeds:中心點

docmatrix:標識文件矩陣

"""return np.matmul(seeds,docmatrix.t)

根據距離矩陣,我們可以找到距離每個文件最近(余弦距離值最大)的中心點,然後將其分配到對應的中心點所在的簇即可。該過程實質上就是找第j

jj列的最大值所在的行iii

,因為第j

jj列代表文件j

jj,第i

ii行代表中心點i

ii,要實現該功能可以使用numpy中的內建函式numpy.where,該函式的詳細用法這裡不做詳細闡述。

對於劃分後的簇,其中心點為簇中所有文件的"平均值"。

def

redivideclusters

(cosmatrix,k,docmatrix)

:"""

cosmatrix:根據中心點計算出的余弦矩陣

將文件劃分到對應的簇,並返回新劃分的簇和對應簇的中心點

"""clusters =[[

]for _ in

range

(k)]

#k個簇

x,y = np.where(cosmatrix == np.

max(cosmatrix,axis=0)

)for i,j in

zip(x,y)

:#print(cosmatrix[i][j])

clusters[i]

#重新計算中心點

k:簇個數

norm:經過歸一化後的文件tfidf矩陣

輸出k個簇和最終的中心點

"""seeds,clusters = randpick(k,norm),[

]#從文件矩陣中隨機挑選k個中心點

clusterchanged =

true

#聚簇收斂標誌位

while clusterchanged:

cd = getcosinedistance(seeds,norm)

#計算各文件到各中心的距離

clusters,nseeds = redivideclusters(cd,k,norm)

#將各文件劃分到對應的簇

if(np.array(nseeds)

== np.array(seeds)).

all():

#中心不再發生變化

clusterchanged =

false

else

: seeds = nseeds

return clusters,seeds

本專案設定的k值為20,將587個中文新聞文件進行聚簇後的最大的三個簇進行展示如下:

在該結果中第乙個列表為簇中文件在文件列表中的索引其真實文件編號為該值加1,第二個列表中每個子元素都包含乙個文件索引和其到對應中心點的距離。下面挑取其中第二個簇中距離簇中心最近的5個文件進行展示:

由上述結果可以看出五篇文章都是和全國游泳冠軍賽話題有關的。

Nginx之2牛刀小試 安裝配置

環境說明 系統版本 centos 7.6 軟體版本 nginx 1.15.9 安裝配置 編譯前環境所需的命令及依賴庫安裝 解壓原始碼包 tar zxvf nginx 1.15.9.tar.gz tar zxvf openssl 1.0.2p.tar.gz 編譯小技巧 make命令預設只會啟用乙個核心...

MySQL資料庫的基本操作之牛刀小試

鏈結資料庫 退出資料庫 sql語句最後需要有分號 結尾 顯示資料庫版本 顯示時間 檢視所有資料庫 建立資料庫 檢視建立資料庫的語句 檢視當前使用的資料庫 使用資料庫 刪除資料庫 檢視當前資料庫中所有表 建立表 檢視表結構 建立students表 id name age high gender cls...

聚類演算法之Kmeans

kmeans是聚類演算法中比較簡單的演算法,也用的非常多。這裡進行簡單的解釋,主要目的在於給自己記錄,以備以後檢視。k均值聚類的主要思想是為了使得各個類的點離聚類中心都盡可能近。k均值聚類的演算法可以描述為 輸入 資料集d d 聚類簇個數 k 演算法 從資料集d中隨機選擇k個樣本作為初始聚類中心 r...