產生雙聚類的數據可以使用函數,
sklearn.datasets.make_biclusters(shape = (row, col), n_clusters, noise, \
shuffle, random_state)
n_clusters 指定聚類數據產生的個數, noise指定使用的Gaussian噪聲的標準差。
其返回的是一個元組,即生成的數據,不同類的行標,不同類的列標。
from sklearn.datasets import sample_generator as sg
sg.shuffle_執行混亂方法,將原數據進行重排。
從其具體實現上可以看出,下面進行重排代碼的功能是類似的:
def _shuffle(data, random_state=None):
generator = check_random_state(random_state)
n_rows, n_cols = data.shape
row_idx = generator.permutation(n_rows)
col_idx = generator.permutation(n_cols)
result = data[row_idx][:, col_idx]
return result, row_idx, col_idx
sklearn.cluster.bicluster.SpectralCoclustering
實現雙聚類的主要算法,給算法fit後,可以調用model.biclusters得到雙聚類的
相應各類下標元組。
model.row_labels_ 及 model.column_labels_分別返回行列下標,當
對其進行重排時,可以返回幾個按序分割的雙聚類圖片。(np.argsort)
下面是示例代碼:
import numpy as np
from matplotlib import pyplot as plt
from sklearn.datasets import make_biclusters
from sklearn.datasets import samples_generator as sg
from sklearn.cluster.bicluster import SpectralCoclustering
from sklearn.metrics import consensus_score
data, rows, columms = make_biclusters(shape = (300, 300), n_clusters = 5, noise = 5, \
shuffle = False, random_state = 0)
plt.matshow(data, cmap = plt.cm.Blues)
plt.title("Original datasets")
data, row_idx, col_idx = sg._shuffle(data, random_state = 0, )
plt.matshow(data, cmap = plt.cm.Blues)
plt.title("Shuffled datasets")
model = SpectralCoclustering(n_clusters = 5, random_state = 0)
model.fit(data)
score = consensus_score(model.biclusters_, (rows[:, row_idx], columms[:, col_idx]))
print "consensus_score: {:.3f}".format(score)
fit_data = data[np.argsort(model.row_labels_)]
fit_data = fit_data[:, np.argsort(model.column_labels_)]
plt.matshow(fit_data, cmap = plt.cm.Blues)
plt.title("After biclustering; rearranged to show biclusters")
plt.show()
將上面的n_clusters換爲二維數組所得到的相應結果就是分塊爲非對角線的形式,是更爲
一般化的分類方法。(雖然也屬雙聚類),相關的函數可以參考下面的函數及相關,
較爲容易的方式
SpectralBiclustering
Python默認的正則表達式僅僅能夠匹配ascii編碼所規定的若干字符,要想將其擴展爲更爲一般的
Unicode需要特別聲明,如re.compile(u'(?u)\\b\\w\\w+\\b')
中的(?u)就將相應的字符集擴充爲Unicode字符集。(擴大匹配範圍)
也就是說這個規定是指向Python2的正則表達式的,Python3對於Unicode是默認匹配。
\b用於匹配單詞字符\w i.e.[A-Za-z0-9_]與非單詞字符\W之間的字符,
此正則表達式的作用在於匹配至少要有兩位數字或字符\\w\\w+,對於僅有一位的情況
\w或直接匹配更多位的情況\w+是一種排除。
def number_aware_tokenizer(doc):
token_pattern = re.compile(u'(?u)\\b\\w\\w+\\b')
tokens = token_pattern.findall(doc)
tokens = ["#NUMBER" if token[0] in "0123456789_" else token for token in tokens]
return tokens
該函數完成對於在doc中首字母爲'_'或數字的以 ‘#NUMBER’來替換,否則保持的方法,
這裏有一些一般性的概念,但基本上token可以看做是對於字符串流的一些提取,不要深究。
這裏有一個有關stop_words的相關處理,停詞指沒有意義的詞,
通過Python包 stop-words可以將英文中常用的停詞取出, 如:
from stop_words import get_stop_words
get_stop_words("english")
會返回英語中常用的停詞。
這涉及文本挖掘數據預處理中的數據清洗。
下面會考慮上面的算法在文本挖掘中的應用,細節餘後作爲討論。