簡體   English   中英

如何使用Sklearn Kmeans聚類稀疏數據

[英]How to cluster sparse data using Sklearn Kmeans

如何使用Sklearn的Kmeans實現對稀疏數據進行聚類?

嘗試根據自己的用例調整其示例,我嘗試:

from sklearn.feature_extraction import DictVectorizer
from sklearn.cluster import KMeans

mydata = [
    (1, {'word1': 2, 'word3': 6, 'word7': 4}),
    (2, {'word11': 1, 'word7': 9, 'word3': 2}),
    (3, {'word5': 7, 'word1': 3, 'word9': 8}),
]

kmeans_data = []
for index, raw_data in mydata:
    cnt_sum = float(sum(raw_data.values()))
    freqs = dict((k, v/cnt_sum) for k, v in raw_data.items())
    v = DictVectorizer(sparse=True)
    X = v.fit_transform(freqs)
    kmeans_data.append(X)

kmeans = KMeans(n_clusters=2, random_state=0).fit(kmeans_data)

但這引發了異常:

  File "/myproject/.env/lib/python3.5/site-packages/sklearn/cluster/k_means_.py", line 854, in _check_fit_data
    X = check_array(X, accept_sparse='csr', dtype=[np.float64, np.float32])
  File "/myproject/.env/lib/python3.5/site-packages/sklearn/utils/validation.py", line 382, in check_array
    array = np.array(array, dtype=dtype, order=order, copy=copy)
ValueError: setting an array element with a sequence.

大概我沒有正確構造我的稀疏輸入矩陣X,因為它是稀疏矩陣的列表,而不是包含列表的稀疏矩陣。 如何構造適當的輸入矩陣?

您正在逐步構建稀疏矩陣。 我不確定是否可以增量使用DictVectorizer。 將元素逐一添加到矩陣會更簡單。 請參閱scipy.sparse.csr_matrix 文檔中的最后一個示例。

增量施工

考慮以下雙重循環:

data = []
rows = []
cols = []
vocabulary = {}
for index, raw_data in mydata:
    cnt_sum = float(sum(raw_data.values()))
    for k,v in raw_data.items():
        f = v/cnt_sum
        i = vocabulary.setdefault(k,len(vocabulary))
        cols.append(i)
        rows.append(index-1)
        data.append(f)

kmeans_data = csr_matrix((data,(rows,cols)))

那么kmeans_data是一個稀疏矩陣,適合用作K-means分類器的輸入。

直接施工

使用DictVectorizer,您可以從元組列表構造數據矩陣,然后使用稀疏線性代數例程對行進行歸一化。

# 1. Construct the sparse matrix with numbers_of_occurrences
D = [d[1] for d in mydata]
v = DictVectorizer(sparse=True)
kmeans_data = v.fit_transform(D)
# 2. Normalize by computing sums for each row and dividing 
import numpy as np
sums = np.sum(kmeans_data,axis=1).A[:,0]
N = len(s)
divisor = csr_matrix((np.reciprocal(s),(range(N),range(N))))
kmeans_data = divisor*kmeans_data)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM