python文本聚類
『壹』 用python採用TF IDF實現從多個文本文檔中選出特徵詞應該怎樣實現
如果最終就是文本分類的話,對所有詞彙得到TF-IDF後,再建立各文本對詞彙表的特徵向量,用餘弦定理判斷相似度,然後做一下聚類,從而實現文本分類。
應該從工程角度效果應該不錯,吳軍博士《數學之美》第14章講到過,裡面把原理也解釋了,很符合直覺,雖然沒有用到太高深的理論。
『貳』 python sklearn里有kmeans演算法嗎
K-Means是常用的聚類演算法,與其他聚類演算法相比,其時間復雜度低,聚類的效果也還不錯,這里簡單介紹一下k-means演算法,下圖是一個手寫體數據集聚類的結果。
基本思想
k-means演算法需要事先指定簇的個數k,演算法開始隨機選擇k個記錄點作為中心點,然後遍歷整個數據集的各條記錄,將每條記錄歸到離它最近的中心點所在的簇中,之後以各個簇的記錄的均值中心點取代之前的中心點,然後不斷迭代,直到收斂,演算法描述如下:
上面說的收斂,可以看出兩方面,一是每條記錄所歸屬的簇不再變化,二是優化目標變化不大。演算法的時間復雜度是O(K*N*T),k是中心點個數,N數據集的大小,T是迭代次數。
優化目標
k-means的損失函數是平方誤差:
RSSk=∑x∈ωk|x?u(ωk)|2
RSS=∑k=1KRSSk
其中$\omega _k$表示第k個簇,$u(\omega _k)$表示第k個簇的中心點,$RSS_k$是第k個簇的損失函數,$RSS$表示整體的損失函數。優化目標就是選擇恰當的記錄歸屬方案,使得整體的損失函數最小。
中心點的選擇
k-meams演算法的能夠保證收斂,但不能保證收斂於全局最優點,當初始中心點選取不好時,只能達到局部最優點,整個聚類的效果也會比較差。可以採用以下方法:k-means中心點
1、選擇彼此距離盡可能遠的那些點作為中心點;
2、先採用層次進行初步聚類輸出k個簇,以簇的中心點的作為k-means的中心點的輸入。
3、多次隨機選擇中心點訓練k-means,選擇效果最好的聚類結果
k值的選取
k-means的誤差函數有一個很大缺陷,就是隨著簇的個數增加,誤差函數趨近於0,最極端的情況是每個記錄各為一個單獨的簇,此時數據記錄的誤差為0,但是這樣聚類結果並不是我們想要的,可以引入結構風險對模型的復雜度進行懲罰:
K=mink[RSSmin(k)+λk]
$\lambda$是平衡訓練誤差與簇的個數的參數,但是現在的問題又變成了如何選取$\lambda$了,有研究[參考文獻1]指出,在數據集滿足高斯分布時,$\lambda=2m$,其中m是向量的維度。
另一種方法是按遞增的順序嘗試不同的k值,同時畫出其對應的誤差值,通過尋求拐點來找到一個較好的k值,詳情見下面的文本聚類的例子。
k-means文本聚類
我爬取了36KR的部分文章,共1456篇,分詞後使用sklearn進行k-means聚類。分詞後數據記錄如下:
使用TF-IDF進行特徵詞的選取,下圖是中心點的個數從3到80對應的誤差值的曲線:
從上圖中在k=10處出現一個較明顯的拐點,因此選擇k=10作為中心點的個數,下面是10個簇的數據集的個數。
{0: 152, 1: 239, 2: 142, 3: 61, 4: 119, 5: 44, 6: 71, 7: 394, 8: 141, 9: 93}
簇標簽生成
聚類完成後,我們需要一些標簽來描述簇,聚類完後,相當於每個類都用一個類標,這時候可以用TFIDF、互信息、卡方等方法來選取特徵詞作為標簽。關於卡方和互信息特徵提取可以看我之前的文章文本特徵選擇,下面是10個類的tfidf標簽結果。
Cluster 0: 商家 商品 物流 品牌 支付 導購 網站 購物 平台 訂單
Cluster 1: 投資 融資 美元 公司 資本 市場 獲得 國內 中國 去年
Cluster 2: 手機 智能 硬體 設備 電視 運動 數據 功能 健康 使用
Cluster 3: 數據 平台 市場 學生 app 移動 信息 公司 醫生 教育
Cluster 4: 企業 招聘 人才 平台 公司 it 移動 網站 安全 信息
Cluster 5: 社交 好友 交友 寵物 功能 活動 朋友 基於 分享 游戲
Cluster 6: 記賬 理財 貸款 銀行 金融 p2p 投資 互聯網 基金 公司
Cluster 7: 任務 協作 企業 銷售 溝通 工作 項目 管理 工具 成員
Cluster 8: 旅行 旅遊 酒店 預訂 信息 城市 投資 開放 app 需求
Cluster 9: 視頻 內容 游戲 音樂 圖片 照片 廣告 閱讀 分享 功能
實現代碼
#!--encoding=utf-8
from __future__ import print_function
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.feature_extraction.text import HashingVectorizer
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans, MiniBatchKMeans
def loadDataset():
'''導入文本數據集'''
f = open('36krout.txt','r')
dataset = []
lastPage = None
for line in f.readlines():
if '< title >' in line and '< / title >' in line:
if lastPage:
dataset.append(lastPage)
lastPage = line
else:
lastPage += line
if lastPage:
dataset.append(lastPage)
f.close()
return dataset
def transform(dataset,n_features=1000):
vectorizer = TfidfVectorizer(max_df=0.5, max_features=n_features, min_df=2,use_idf=True)
X = vectorizer.fit_transform(dataset)
return X,vectorizer
def train(X,vectorizer,true_k=10,minibatch = False,showLable = False):
#使用采樣數據還是原始數據訓練k-means,
if minibatch:
km = MiniBatchKMeans(n_clusters=true_k, init='k-means++', n_init=1,
init_size=1000, batch_size=1000, verbose=False)
else:
km = KMeans(n_clusters=true_k, init='k-means++', max_iter=300, n_init=1,
verbose=False)
km.fit(X)
if showLable:
print("Top terms per cluster:")
order_centroids = km.cluster_centers_.argsort()[:, ::-1]
terms = vectorizer.get_feature_names()
print (vectorizer.get_stop_words())
for i in range(true_k):
print("Cluster %d:" % i, end='')
for ind in order_centroids[i, :10]:
print(' %s' % terms[ind], end='')
print()
result = list(km.predict(X))
print ('Cluster distribution:')
print (dict([(i, result.count(i)) for i in result]))
return -km.score(X)
def test():
'''測試選擇最優參數'''
dataset = loadDataset()
print("%d documents" % len(dataset))
X,vectorizer = transform(dataset,n_features=500)
true_ks = []
scores = []
for i in xrange(3,80,1):
score = train(X,vectorizer,true_k=i)/len(dataset)
print (i,score)
true_ks.append(i)
scores.append(score)
plt.figure(figsize=(8,4))
plt.plot(true_ks,scores,label="error",color="red",linewidth=1)
plt.xlabel("n_features")
plt.ylabel("error")
plt.legend()
plt.show()
def out():
'''在最優參數下輸出聚類結果'''
dataset = loadDataset()
X,vectorizer = transform(dataset,n_features=500)
score = train(X,vectorizer,true_k=10,showLable=True)/len(dataset)
print (score)
#test()
out()
『叄』 python數據分析-聚類分析(轉載)
聚類分析是一類將數據所對應的研究對象進行分類的統計方法。這一類方法的共同特點是,事先不知道類別的個數與結構;進行分析的數據是表明對象之間的相似性或相異性的數據,將這飢判些數據看成對對象「距離」遠近的一種度量,將距離近的對象歸入一類,不同類對象之間的距離較遠。爛好改
[if !supportLineBreakNewLine]
[endif]
聚類分析根據對象的不同分為Q型聚類分析和R型聚類分析,其中,Q型聚類是指對樣本的聚類,R型聚類是指對變數的聚類。本節主要介紹Q型聚類。
一、距離和相似系數
1.1 、距離 在聚類過程中,相距較近的樣本點傾向於歸為一類,相距較遠的樣本點應歸屬於不同的類。最常用的是Minkowski距離。當各變數的單位不同或變異性相差很大時,不應直接採用Minkowski距離,而應先對各變數的數據做標准化處理,然後用標准化後的數據計算距離。使用SciPy庫spatial模塊下的distance子模塊可以計算距離,使用該子模塊下的pdist函數可以計算n維空間中觀測值之間的距襪豎離,其語法格式如下:
獲取更多知識,前往前往我的wx ————公z號 (程式解說)
原文來自 https:// https://mp.weixin.qq.com/s/ZB1V8NZHJLfKFgIJgiRxOw
『肆』 python 數據挖掘需要用哪些庫和工具
python 數據挖掘常用的庫太多了!主要分為以下幾大類:
第一數據獲取:request,BeautifulSoup
第二基本數學庫:numpy
第三 資料庫出路 pymongo
第四 圖形可視化 matplotlib
第五 樹分析基本的庫 pandas
數據挖掘一般是指從大量的數據中通過演算法搜索隱藏於其中信息的過程。數據挖掘本質上像是機器學習和人工智慧的基礎,它的主要目的是從各種各樣的數據來源中,提取出超集的信息,然後將這些信息合並讓你發現你從來沒有想到過的模式和內在關系。這就意味著,數據挖掘不是一種用來證明假說的方法,而是用來構建各種各樣的假說的方法。
想要了解更多有關python 數據挖掘的信息,可以了解一下CDA數據分析師的課程。CDA數據分析師證書的含金量是很高的,簡單從兩個方面分析一下:首先是企業對於CDA的認可,經管之家CDA LEVEL Ⅲ數據科學家認證證書,屬於行業頂尖的人才認證,已獲得IBM大數據大學,中國電信,蘇寧,德勤,獵聘,CDMS等企業的認可。CDA證書逐漸獲得各企業用人單位認可與引進,如中國電信、中國移動、德勤,蘇寧,中國銀行,重慶統計局等。點擊預約免費試聽課。
『伍』 python代碼如何應用系統聚類和K-means聚類法進行聚類分析 然後選擇變數,建立適當的模型
-Means聚類演算法
k-means演算法以k為參數,把n個對象分成k個簇,使簇內具有較高的相似度,而簇間的相似度較低。
隨機選擇k個點作為初始的聚類中心。
對於剩下的點,根據其與聚類中心的距離,將其歸入最近的簇。
對每個簇,計算所有點的均值作為新的聚類中心。
重復2,3直到聚類中心不再發生改變
Figure 1
K-means的應用
數據介紹:
現有1999年全國31個省份城鎮居民家庭平均每人全年消費性支出的八大主要變數數據,這八大變數分別是:食品、衣著、家庭設備用品及服務、醫療保健、交通和通訊、娛樂教育文化服務、居住以及雜項商品和服務。利用已有數據,對31個省份進行聚類。
實驗目的:
通過聚類,了解1999年各個省份的消費水平在國內的情況。
技術路線:
sklearn.cluster.Kmeans
數據實例:
『陸』 建議收藏!10 種 Python 聚類演算法完整操作示例
聚類或聚類分析是無監督學習問題。它通常被用作數據分析技術,用於發現數據中的有趣模式,例如基於其行為的客戶群。有許多聚類演算法可供選擇,對於所有情況,沒有單一的最佳聚類演算法。相反,最好探索一系列聚類演算法以及每種演算法的不同配置。在本教程中,你將發現如何在 python 中安裝和使用頂級聚類演算法。完成本教程後,你將知道:
聚類分析,即聚類,是一項無監督的機器學習任務。它包括自動發現數據中的自然分組。與監督學習(類似預測建模)不同,聚類演算法只解釋輸入數據,並在特徵空間中找到自然組或群集。
群集通常是特徵空間中的密度區域,其中來自域的示例(觀測或數據行)比其他群集更接近群集。群集可以具有作為樣本或點特徵空間的中心(質心),並且可以具有邊界或范圍。
聚類可以作為數據分析活動提供幫助,以便了解更多關於問題域的信息,即所謂的模式發現或知識發現。例如:
聚類還可用作特徵工程的類型,其中現有的和新的示例可被映射並標記為屬於數據中所標識的群集之一。雖然確實存在許多特定於群集的定量措施,但是對所識別的群集的評估是主觀的,並且可能需要領域專家。通常,聚類演算法在人工合成數據集上與預先定義的群集進行學術比較,預計演算法會發現這些群集。
有許多類型的聚類演算法。許多演算法在特徵空間中的示例之間使用相似度或距離度量,以發現密集的觀測區域。因此,在使用聚類演算法之前,擴展數據通常是良好的實踐。
一些聚類演算法要求您指定或猜測數據中要發現的群集的數量,而另一些演算法要求指定觀測之間的最小距離,其中示例可以被視為「關閉」或「連接」。因此,聚類分析是一個迭代過程,在該過程中,對所識別的群集的主觀評估被反饋回演算法配置的改變中,直到達到期望的或適當的結果。scikit-learn 庫提供了一套不同的聚類演算法供選擇。下面列出了10種比較流行的演算法:
每個演算法都提供了一種不同的方法來應對數據中發現自然組的挑戰。沒有最好的聚類演算法,也沒有簡單的方法來找到最好的演算法為您的數據沒有使用控制實驗。在本教程中,我們將回顧如何使用來自 scikit-learn 庫的這10個流行的聚類演算法中的每一個。這些示例將為您復制粘貼示例並在自己的數據上測試方法提供基礎。我們不會深入研究演算法如何工作的理論,也不會直接比較它們。讓我們深入研究一下。
在本節中,我們將回顧如何在 scikit-learn 中使用10個流行的聚類演算法。這包括一個擬合模型的例子和可視化結果的例子。這些示例用於將粘貼復制到您自己的項目中,並將方法應用於您自己的數據。
1.庫安裝
首先,讓我們安裝庫。不要跳過此步驟,因為你需要確保安裝了最新版本。你可以使用 pip Python 安裝程序安裝 scikit-learn 存儲庫,如下所示:
接下來,讓我們確認已經安裝了庫,並且您正在使用一個現代版本。運行以下腳本以輸出庫版本號。
運行該示例時,您應該看到以下版本號或更高版本。
2.聚類數據集
我們將使用 make _ classification ()函數創建一個測試二分類數據集。數據集將有1000個示例,每個類有兩個輸入要素和一個群集。這些群集在兩個維度上是可見的,因此我們可以用散點圖繪制數據,並通過指定的群集對圖中的點進行顏色繪制。這將有助於了解,至少在測試問題上,群集的識別能力如何。該測試問題中的群集基於多變數高斯,並非所有聚類演算法都能有效地識別這些類型的群集。因此,本教程中的結果不應用作比較一般方法的基礎。下面列出了創建和匯總合成聚類數據集的示例。
運行該示例將創建合成的聚類數據集,然後創建輸入數據的散點圖,其中點由類標簽(理想化的群集)著色。我們可以清楚地看到兩個不同的數據組在兩個維度,並希望一個自動的聚類演算法可以檢測這些分組。
已知聚類著色點的合成聚類數據集的散點圖接下來,我們可以開始查看應用於此數據集的聚類演算法的示例。我已經做了一些最小的嘗試來調整每個方法到數據集。3.親和力傳播親和力傳播包括找到一組最能概括數據的範例。
它是通過 AffinityPropagation 類實現的,要調整的主要配置是將「 阻尼 」設置為0.5到1,甚至可能是「首選項」。下面列出了完整的示例。
運行該示例符合訓練數據集上的模型,並預測數據集中每個示例的群集。然後創建一個散點圖,並由其指定的群集著色。在這種情況下,我無法取得良好的結果。
數據集的散點圖,具有使用親和力傳播識別的聚類
4.聚合聚類
聚合聚類涉及合並示例,直到達到所需的群集數量為止。它是層次聚類方法的更廣泛類的一部分,通過 AgglomerationClustering 類實現的,主要配置是「 n _ clusters 」集,這是對數據中的群集數量的估計,例如2。下面列出了完整的示例。
運行該示例符合訓練數據集上的模型,並預測數據集中每個示例的群集。然後創建一個散點圖,並由其指定的群集著色。在這種情況下,可以找到一個合理的分組。
使用聚集聚類識別出具有聚類的數據集的散點圖
5.BIRCHBIRCH
聚類( BIRCH 是平衡迭代減少的縮寫,聚類使用層次結構)包括構造一個樹狀結構,從中提取聚類質心。
它是通過 Birch 類實現的,主要配置是「 threshold 」和「 n _ clusters 」超參數,後者提供了群集數量的估計。下面列出了完整的示例。
運行該示例符合訓練數據集上的模型,並預測數據集中每個示例的群集。然後創建一個散點圖,並由其指定的群集著色。在這種情況下,可以找到一個很好的分組。
使用BIRCH聚類確定具有聚類的數據集的散點圖
6.DBSCANDBSCAN
聚類(其中 DBSCAN 是基於密度的空間聚類的雜訊應用程序)涉及在域中尋找高密度區域,並將其周圍的特徵空間區域擴展為群集。
它是通過 DBSCAN 類實現的,主要配置是「 eps 」和「 min _ samples 」超參數。下面列出了完整的示例。
運行該示例符合訓練數據集上的模型,並預測數據集中每個示例的群集。然後創建一個散點圖,並由其指定的群集著色。在這種情況下,盡管需要更多的調整,但是找到了合理的分組。
使用DBSCAN集群識別出具有集群的數據集的散點圖
7.K均值
K-均值聚類可以是最常見的聚類演算法,並涉及向群集分配示例,以盡量減少每個群集內的方差。
它是通過 K-均值類實現的,要優化的主要配置是「 n _ clusters 」超參數設置為數據中估計的群集數量。下面列出了完整的示例。
運行該示例符合訓練數據集上的模型,並預測數據集中每個示例的群集。然後創建一個散點圖,並由其指定的群集著色。在這種情況下,可以找到一個合理的分組,盡管每個維度中的不等等方差使得該方法不太適合該數據集。
使用K均值聚類識別出具有聚類的數據集的散點圖
8.Mini-Batch
K-均值Mini-Batch K-均值是 K-均值的修改版本,它使用小批量的樣本而不是整個數據集對群集質心進行更新,這可以使大數據集的更新速度更快,並且可能對統計雜訊更健壯。
它是通過 MiniBatchKMeans 類實現的,要優化的主配置是「 n _ clusters 」超參數,設置為數據中估計的群集數量。下面列出了完整的示例。
運行該示例符合訓練數據集上的模型,並預測數據集中每個示例的群集。然後創建一個散點圖,並由其指定的群集著色。在這種情況下,會找到與標准 K-均值演算法相當的結果。
帶有最小批次K均值聚類的聚類數據集的散點圖
9.均值漂移聚類
均值漂移聚類涉及到根據特徵空間中的實例密度來尋找和調整質心。
它是通過 MeanShift 類實現的,主要配置是「帶寬」超參數。下面列出了完整的示例。
運行該示例符合訓練數據集上的模型,並預測數據集中每個示例的群集。然後創建一個散點圖,並由其指定的群集著色。在這種情況下,可以在數據中找到一組合理的群集。
具有均值漂移聚類的聚類數據集散點圖
10.OPTICSOPTICS
聚類( OPTICS 短於訂購點數以標識聚類結構)是上述 DBSCAN 的修改版本。
它是通過 OPTICS 類實現的,主要配置是「 eps 」和「 min _ samples 」超參數。下面列出了完整的示例。
運行該示例符合訓練數據集上的模型,並預測數據集中每個示例的群集。然後創建一個散點圖,並由其指定的群集著色。在這種情況下,我無法在此數據集上獲得合理的結果。
使用OPTICS聚類確定具有聚類的數據集的散點圖
11.光譜聚類
光譜聚類是一類通用的聚類方法,取自線性線性代數。
它是通過 Spectral 聚類類實現的,而主要的 Spectral 聚類是一個由聚類方法組成的通用類,取自線性線性代數。要優化的是「 n _ clusters 」超參數,用於指定數據中的估計群集數量。下面列出了完整的示例。
運行該示例符合訓練數據集上的模型,並預測數據集中每個示例的群集。然後創建一個散點圖,並由其指定的群集著色。在這種情況下,找到了合理的集群。
使用光譜聚類聚類識別出具有聚類的數據集的散點圖
12.高斯混合模型
高斯混合模型總結了一個多變數概率密度函數,顧名思義就是混合了高斯概率分布。它是通過 Gaussian Mixture 類實現的,要優化的主要配置是「 n _ clusters 」超參數,用於指定數據中估計的群集數量。下面列出了完整的示例。
運行該示例符合訓練數據集上的模型,並預測數據集中每個示例的群集。然後創建一個散點圖,並由其指定的群集著色。在這種情況下,我們可以看到群集被完美地識別。這並不奇怪,因為數據集是作為 Gaussian 的混合生成的。
使用高斯混合聚類識別出具有聚類的數據集的散點圖
在本文中,你發現了如何在 python 中安裝和使用頂級聚類演算法。具體來說,你學到了:
『柒』 如何用python對文本進行聚類
實現原理:
首先從Tourist_spots_5A_BD.txt中讀取景點信息,然後通過調用無界面瀏覽器PhantomJS(Firefox可替代)訪問網路鏈接"http://ke..com/",通過Selenium獲取輸入對話框ID,輸入關鍵詞如"故宮",再訪問該網路頁面。最後通過分析DOM樹結構獲取摘要的ID並獲取其值。核心代碼如下:
driver.find_elements_by_xpath("//div[@class='lemma-summary']/div")
PS:Selenium更多應用於自動化測試,推薦Python爬蟲使用scrapy等開源工具。
# coding=utf-8
"""
Created on 2015-09-04 @author: Eastmount
"""
import time
import re
import os
import sys
import codecs
import shutil
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import selenium.webdriver.support.ui as ui
from selenium.webdriver.common.action_chains import ActionChains
#Open PhantomJS
driver = webdriver.PhantomJS(executable_path="G:\phantomjs-1.9.1-windows\phantomjs.exe")
#driver = webdriver.Firefox()
wait = ui.WebDriverWait(driver,10)
#Get the Content of 5A tourist spots
def getInfobox(entityName, fileName):
try:
#create paths and txt files
print u'文件名稱: ', fileName
info = codecs.open(fileName, 'w', 'utf-8')
#locate input notice: 1.visit url by unicode 2.write files
#Error: Message: Element not found in the cache -
# Perhaps the page has changed since it was looked up
#解決方法: 使用Selenium和Phantomjs
print u'實體名稱: ', entityName.rstrip('\n')
driver.get("http://ke..com/")
elem_inp = driver.find_element_by_xpath("//form[@id='searchForm']/input")
elem_inp.send_keys(entityName)
elem_inp.send_keys(Keys.RETURN)
info.write(entityName.rstrip('\n')+'\r\n') #codecs不支持'\n'換行
time.sleep(2)
#load content 摘要
elem_value = driver.find_elements_by_xpath("//div[@class='lemma-summary']/div")
for value in elem_value:
print value.text
info.writelines(value.text + '\r\n')
time.sleep(2)
except Exception,e: #'utf8' codec can't decode byte
print "Error: ",e
finally:
print '\n'
info.close()
#Main function
def main():
#By function get information
path = "BaiSpider\\"
if os.path.isdir(path):
shutil.rmtree(path, True)
os.makedirs(path)
source = open("Tourist_spots_5A_BD.txt", 'r')
num = 1
for entityName in source:
entityName = unicode(entityName, "utf-8")
if u'故宮' in entityName: #else add a '?'
entityName = u'北京故宮'
name = "%04d" % num
fileName = path + str(name) + ".txt"
getInfobox(entityName, fileName)
num = num + 1
print 'End Read Files!'
source.close()
driver.close()
if __name__ == '__main__':
main()
『捌』 python文本聚類太慢
題主是否想詢問「python文本好唯型聚類太慢的原因是什麼」?原因是硬體設備限制。根據相關資料查詢顯示,Python進行文本聚類需要很高的配置要求,友猜計算機的硬體配置較低,如CPU、內存、硬碟等性能不足,那麼會導致程序的運行速山沒度較慢,更新電腦配置即可解決。