9.24學習筆記(異常分析)

基本思想:聚類分析思想

將數據集中的數據看作多維空間中的點(特徵向量)
孤立點是數據集中與大多數數據的距離都超過某個閾值的那些數據
優點:在不值得數據分佈的情況下也能進行孤立點分析
缺點:閾值很難選取,並且當數據集和維度較大時,計算量較大
劃分方法:給定n個樣本的數據集以及要生成的簇的數目k,劃分方法將樣本組織爲k個劃分(k<=n),每個劃分代表一個簇
劃分準則:同一個簇中的樣本儘可能接近或相似,不同簇中的樣本儘可能遠離或不相似

典型劃分方法:
k-means(k-均值):由簇中樣本的平均值來代表整個簇
k-medoids(k-中心點):由處於簇中心區域的某個樣本來代表整個簇

def __init__(self,n_clusters=8,init='k-means++',n_init=10,max_iter=300,tol=1e-4,precompute_distnnces='auto',verbose=0,random_state=None,copy_x=True,n_jobs=1):

輸入參數:
n_clusters
要分成的簇數也是要生成的質心數
類型:整數型(int)
默認值:8

init
初始化質心
類型:可以是function可以是array(random or ndarray)
默認值:採用k-means++(一種生成初始質心的算法)

n_init
設置選擇質心種子次數,默認爲10次。返回質心最好的一次結果(好是指計算時長短)
目的:每一次算法運行時開始的centroid seeds是隨機生成的,這樣得到的結果也可能有好有壞,所以要運行n_init次,取其中最好的

max_iter
每次迭代的最大次數
類型:整形(int)
默認值:300

tol
容忍的最小誤差,當誤差小於tol就會退出迭代(算法中會依賴數據本身)
類型:浮點型(float)
默認值:1e-4(0.0001)

n_jobs
使用進程的數量,與cpu個數有關
類型:整數型(int)
默認值:1

輸出參數:
label_:每個樣本對應的簇類別標籤
示例:r1=pd.Series(model.labels_).value_counts() #統計各個類別的數目

cluster_centers_:聚類中心
返回值:array,[n_clusters,n_features]
示例:r2=pd.DataFrame(model.cluster_centers_) #找出聚類中心

K-Means示例

#使用K-Means算法聚類
import pandas as pd
import numpy as np
from sklearn.cluster import KMeans
#參數初始化
inputfile='kmeans.data'         #銷量及其他屬性數據
outputfile='kmoutput.xls'       #保存結果的文件名
k=3                             #聚類的類別
iteration=500                   #聚類最大循環次數
dataset=np.loadtxt(fname='kmeans.data',delimiter=',')
data=pd.read_csv(inputfile,header=None)
data_zs=1.0*(data-data.mean())/data.std()       #數據標準化
model=KMeans(n_clusters=k,n_jobs=4,max_iter=iteration)  #分爲4類,併發數4
model.fit(data_zs)      #開始聚類
#簡單打印結果
r1=pd.Series(model.labels_).value_counts()   #統計各個類別的數目
r2=pd.DataFrame(model.cluster_centers_)     #找出聚類中心
r=pd.concat([r2,r1],axis=1)                 #橫向連接(0是縱向,得到聚類中心對應的類別下的數目
r.columns=list(data.columns)+[u'類別數目']  #重命名錶頭
print(r)
#詳細輸出原始數據及其類別
r=pd.concat([data,pd.Series(model.labels_,index=data.index)],axis=1)
#詳細輸出每個樣本對應的類別
r.columns=list(data.columns)+[u'聚類類別']   #重命名錶頭
r.to_excel(outputfile)                      #保存結果

#聚類分析結果可視化
from sklearn.manifold import TSNE
tsne=TSNE()
tsne.fit_transform(data_zs)                 #進行數據降維
tsne=pd.DataFrame(tsne.embedding_,index=data_zs.index)#轉換數據格式
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei']     #用來正常顯示中文標籤
plt.rcParams['axes.unicode_minus']=False        #用來正常顯示負號
#不同類別用不同顏色和樣式繪圖
d=tsne[r[u'聚類類別']==0]
plt.plot(d[0],d[1],'r.')
d=tsne[r[u'聚類類別']==1]
plt.plot(d[0],d[1],'go')
d=tsne[r[u'聚類類別']==2]
plt.plot(d[0],d[1],'b*')
plt.show()

結果:
0 1 2 3 … 6 7 8 類別數目
0 0.980221 0.272167 0.341372 -0.497458 … -0.047186 1.038799 0.384136 223
1 -0.215547 0.885108 0.323910 0.909813 … 0.531096 -0.007197 0.824300 160
2 -0.478186 -0.525482 -0.332342 -0.089966 … -0.193384 -0.598703 -0.565065 385

[3 rows x 10 columns]
在這裏插入圖片描述
電腦可能不支持多線程,n_jobs設置除1之外全部報錯

聚類分析結果的降維可視化-TSNE,將輸入的高維特徵數在2維或3維的空間中展示

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章