[方法]原理
クラスタはSklearnの関数kmeans、凝集型(重合プロセスの階層的クラスタリング、他の分割)と、元DBSCAN関数(属密度クラスタリング)を提供します。
関数kmeans手段は空間K点で表現アルゴリズムが近い分類のポイントに、中心部にクラスター化しました。
1、ランダムデータ集合D kを(以前に設定)要素、k個のクラスのそれぞれの初期中心に(又はデータ空間の範囲内)から。
図2は、残りの要素は、k個のクラスタの中心までの距離を計算し、大きさは、距離に応じて、これらの要素は、最も近いクラスに分類されます。
図3は、クラスタリング結果によれば、k個のクラスのそれぞれの中心を再計算しました。典型的には、撮影した各次元のクラス内のすべての要素の算術平均が算出されました。
DBSCANコアアイデアがある:より高い点の密度がそれによって同じクラスを生成する1つに一緒に(ポイントが近い距離ではありません)。
アルゴリズム:
1、より多くの閾値よりも円MinPts(予め設定)における点の数がポイントまたは高密度コア・ポイントを指すように言われている場合、その半径としてEPS(プリセット)で行われ、各データポイントのために。サークルのすべての点は、リンクを形成するように接続されています。すべてのポイントは、リンクに基づいています。
2、サイズがあまりMinPts点密度と呼ばれる円形、または外れ値、外れ値を超える場合。
階層的クラスタリング(階層的クラスタリング)は、ネストされた階層的クラスタリングツリー内のデータ点の異なるカテゴリ間の類似度を計算することにより作成したクラスタリングアルゴリズムです。クラスタリングツリーで、生データ点の異なるタイプは、ツリーの最下位層である、木の上部には、クラスタのルートノードです。
クラスタリング効果の評価:
1)ランドインデックス
式は、ランダム、同じ確率の組からの二つの要素の対を選択しています。
[-1、1]、否定結果が不良であるARI値の範囲は、ラベルは、独立して分布し、ARI分布同様の結果が肯定、1で記載されている最良の結果は、正確にタグの二種類の同じ分布であります;
均一0にタグ近い分散ARIランダム値;
2)輪郭係数
iがクラスタの非類似度の相違I Bに従ってサンプリングプロファイル係数試料を(i)は、(i)とクラスタ間で定義されます。
コアアイデアが決定することである:クラス間の距離等の相対的な大きさ及び距離を、>型の距離内のクラスとの間の距離場合、良好なクラスタリング結果、逆に良好ではありません。
S(i)は1に近い、それは合理的なクラスタリングサンプルことを私を示し、-1に近いが、それは私が別のクラスタに分類のサンプルことを示し、約0、2つのクラスタの境界に
[結果]
[コード]
import nltk
from nltk.corpus import movie_reviews
from pylab import plot,show
from numpy import array
from numpy.random import rand
from scipy.cluster.vq import kmeans,vq,whiten
import numpy as np
import random
documents = [(list(movie_reviews.words(fileid)), category) for category in movie_reviews.categories() for fileid in movie_reviews.fileids(category)] #转化为词列表的影评,与标签,组成二元组
random.shuffle(documents)
all_words = nltk.FreqDist(w.lower() for w in movie_reviews.words()) #建立全部影评的词频表
all_words=all_words.most_common(2000) #词频表按频率排序
stopwords = nltk.corpus.stopwords.words('english')
word_features =[w for (w,f) in all_words if w not in stopwords] #特征词为词频表中前2000词
features = np.zeros([len(documents),len(word_features)],dtype=float)
#np.zeros((数组形状),dtype,older)--返回一个给定形状和类型的用0填充的数组
#(形状:(5,)(5,5);older: C表示行优先,F表示列优先(可选参数))
for n in range(len(documents)):
document_words = set(documents[n][0])
for m in range(len(word_features)):
if word_features[m] in document_words:
features[n,m] = 1
target=[c for (d,c) in documents]
'''Kmeans聚类'''
##1)Kmeans的Scipy实现
data=whiten(features)
#Whiten:通过除以标准差,归一化各维度的变化尺度。在Kmeans算法实施前做为预处理,使每个特征的作用相同。处理后的向量变为‘白噪声’。
centroids,_ = kmeans(data,2)
idx,_ = vq(data,centroids)
target1=[1 if x =='pos' else 0 for x in target]
a=sum(target1==idx)/len(target1)
print('scipy_eu=',max(a,1-a))
##2)Kmeans的NLTK实现。NLTK,Bio都可以选择距离函数
from nltk.cluster import KMeansClusterer,cosine_distance
clus=KMeansClusterer(2,cosine_distance)#分为两类,距离函数用余弦相似度
results=clus.cluster(data,True,trace=False)
##3)Kmeans的Bio实现
#from Bio.Cluster import kcluster
#clusterid, error, nfound = kcluster(data,2,dist='c')
'''层级聚类(聚合Agglomerative)'''
import scipy
from scipy.cluster.hierarchy import linkage,fcluster
agg=linkage(data,method='single',metric='euclidean')
#获取集群信息
max_d=50#选择临界距离决定集群数量(应该画图看出吧)
clusters=fcluster(agg, max_d, criterion='distance')
#print(clusters)
'''密度聚类(DBSCAN)'''
from sklearn.cluster import DBSCAN
#eps为距离阈值ϵ,min_samples为邻域样本数阈值MinPts,X为数据
y_pred = DBSCAN(eps = 50, min_samples = 3,metric='euclidean').fit(data)
labels=y_pred.labels_ #聚类标签
print(labels[:100])
##聚类效果评估
print("兰德指数ARI:")
from sklearn import metrics
print("Kmeans_ARI:%s"%metrics.adjusted_rand_score(np.array(target1),results))
print("Agglomerative_ARI:%s"%metrics.adjusted_rand_score(np.array(target1),clusters))
print("DBSCAN_ARI:%s"%metrics.adjusted_rand_score(np.array(target1),labels))
print("轮廓系数:")
from sklearn.metrics import silhouette_score
print("1)使用欧式距离:")
sc_score = silhouette_score(data, results, metric='euclidean')
print("Kmeans:",sc_score)
sc_score = silhouette_score(data, clusters, metric='euclidean')
print("Agglomerative:",sc_score)
sc_score = silhouette_score(data, labels, metric='euclidean')
print("DBSCAN:",sc_score)
print("2)使用余弦距离:")
sc_score = silhouette_score(data, results, metric='cosine')
print("Kmeans:",sc_score)
sc_score = silhouette_score(data, clusters, metric='cosine')
print("Agglomerative:",sc_score)
sc_score = silhouette_score(data, labels, metric='cosine')
print("DBSCAN:",sc_score)