Clustering
為什麼使用 DBSCAN 將我的大部分點歸類為噪聲?
我正在使用 sklearn 中的幾種聚類算法來聚類一些數據,但似乎無法弄清楚 DBSCAN 發生了什麼。我的數據是來自 TfidfVectorizer 的文檔術語矩陣,包含數百個預處理文檔。
代碼:
tfv = TfidfVectorizer(stop_words=STOP_WORDS, tokenizer=StemTokenizer()) data = tfv.fit_transform(dataset) db = DBSCAN(eps=eps, min_samples=min_samples) result = db.fit_predict(data) svd = TruncatedSVD(n_components=2).fit_transform(data) // Set the colour of noise pts to black for i in range(0,len(result)): if result[i] == -1: result[i] = 7 colors = [LABELS[l] for l in result] pl.scatter(svd[:,0], svd[:,1], c=colors, s=50, linewidths=0.5, alpha=0.7)
這是 eps=0.5, min_samples=5 得到的結果:
基本上,除非我將 min_samples 設置為 3,否則我根本無法獲得任何集群,這給出了:
我嘗試了 eps/min_samples 值的各種組合併得到了類似的結果。它似乎總是首先聚集低密度區域。為什麼會這樣聚集?我可能錯誤地使用了 TruncatedSVD 嗎?
原始TFIDF數據的SVD 投影分數的散點圖確實表明確實應該檢測到一些密度結構。然而,這些數據並不是 DBSCAN 提供的輸入。看來您正在使用原始 TFIDF數據作為輸入。
原始 TFIDF 數據集是稀疏且高維的,這是非常合理的。在這樣的域中檢測基於密度的集群將非常苛刻。高維密度估計是一個相當困難的問題;這是維度詛咒開始的典型場景。我們只是看到了這個問題的表現(“詛咒”);DBSCAN 返回的結果聚類本身相當稀疏,並且假設(可能錯誤地)手頭的數據充滿了異常值。
我建議,至少在第一個實例中,DBSCAN 提供了用於創建顯示為輸入的散點圖的投影分數。這種方法將有效地成為潛在語義分析(LSA)。在 LSA 中,我們使用包含所分析文本語料庫字數的矩陣的 SVD 分解(或 TFIDF 返回的標準化術語文檔矩陣)來研究手頭語料庫的文本單元之間的關係。