乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      數(shù)據(jù)挖掘——聚類分析總結(jié)(建議收藏)

       15所 2020-03-12

      聚類分析

      一、概念

      聚類分析是按照個體的特征將他們分類,讓同一個類別內(nèi)的個體之間具有較高的相似度,不同類別之間具有較大的差異性

      聚類分析屬于無監(jiān)督學(xué)習(xí)

      聚類對象可以分為Q型聚類和R型聚類

      Q型聚類:樣本/記錄聚類距離為相似性指標(biāo) (歐氏距離、歐氏平方距離、馬氏距離、明式距離等)

      R型聚類:指標(biāo)/變量聚類相似系數(shù)為相似性指標(biāo) (皮爾遜相關(guān)系數(shù)、夾角余弦、指數(shù)相關(guān)系數(shù)等)

      二、常用的聚類算法

      • K-Means劃分法
      • 層次聚類法
      • DBSCAN密度法

      1、K-Means劃分法

      K表示聚類算法中類的個數(shù),Means表示均值算法,K-Means即是用均值算法把數(shù)據(jù)分成K個類的算法。

      K-Means算法的目標(biāo),是把n個樣本點(diǎn)劃分到k個類中,使得每個點(diǎn)都屬于離它最近的質(zhì)心(一個類內(nèi)部所有樣本點(diǎn)的均值)對應(yīng)的類,以之作為聚類的標(biāo)準(zhǔn)。

      算法原理見 http://www./thread-18178-1-1.html【轉(zhuǎn)】

      K-Means算法的計算步驟

      • 取得k個初始質(zhì)心:從數(shù)據(jù)中隨機(jī)抽取k個點(diǎn)作為初始聚類的中心,來代表各個類
      • 把每個點(diǎn)劃分進(jìn)相應(yīng)的類:根據(jù)歐式距離最小原則,把每個點(diǎn)劃分進(jìn)距離最近的類中
      • 重新計算質(zhì)心:根據(jù)均值等方法,重新計算每個類的質(zhì)心
      • 迭代計算質(zhì)心:重復(fù)第二步和第三步,迭代計算
      • 聚類完成:聚類中心不再發(fā)生移動

      基于sklearn包的實(shí)現(xiàn)

      導(dǎo)入一份如下數(shù)據(jù),經(jīng)過各變量間的散點(diǎn)圖和相關(guān)系數(shù),發(fā)現(xiàn)工作日上班電話時長與總電話時長存在強(qiáng)正相關(guān)關(guān)系

      數(shù)據(jù)挖掘——聚類分析總結(jié)(建議收藏)

      選擇可建模的變量并降維

      cloumns_fix1 = ['工作日上班時電話時長', '工作日下半時電話時長', '周末電話時長', '國際電話時長', '平均每次通話時長']#數(shù)據(jù)降維pca_2 = PCA(n_components=2)data_pca_2 = pd.DataFrame(pca_2.fit_transform(data[cloumns_fix1]))

      通過sklearn包中的K-Means方法構(gòu)建模型

      #繪制散點(diǎn)圖查看數(shù)據(jù)點(diǎn)大致情況plt.scatter(data_pca_2[0],data_pca_2[1])
      #預(yù)計將數(shù)據(jù)點(diǎn)分類為3類kmmodel = KMeans(n_clusters=3) #創(chuàng)建模型kmmodel = kmmodel.fit(data[cloumns_fix1]) #訓(xùn)練模型ptarget = kmmodel.predict(data[cloumns_fix1]) #對原始數(shù)據(jù)進(jìn)行標(biāo)注pd.crosstab(ptarget,ptarget) #交叉表查看各個類別數(shù)據(jù)的數(shù)量

      plt.scatter(data_pca_2[0],data_pca_2[1],c=ptarget)#查看聚類的分布情況

      數(shù)據(jù)挖掘——聚類分析總結(jié)(建議收藏)

      最后,可以通過直方圖查看各聚類間的差異

      #查看各類之間的差異dMean = pd.DataFrame(columns=cloumns_fix1+['分類']) #得到每個類別的均值data_gb = data[cloumns_fix1].groupby(ptarget) #按標(biāo)注進(jìn)行分組i = 0for g in data_gb.groups:    rMean = data_gb.get_group(g).mean()     rMean['分類'] = g;    dMean = dMean.append(rMean, ignore_index=True)    subData = data_gb.get_group(g)    for column in cloumns_fix1:        i = i+1;        p = plt.subplot(3, 5, i)        p.set_title(column)        p.set_ylabel(str(g) + '分類')        plt.hist(subData[column], bins=20)

      數(shù)據(jù)挖掘——聚類分析總結(jié)(建議收藏)

      2、 層次聚類法

      層次聚類算法又稱為樹聚類算法,它根據(jù)數(shù)據(jù)之間的距離,透過一種層次架構(gòu)方式,反復(fù)將數(shù)據(jù)進(jìn)行聚合,創(chuàng)建一個層次以分解給定的數(shù)據(jù)集。層次聚類算法常用于一維數(shù)據(jù)的自動分組。

      層次聚類算法是一種很直觀的聚類算法,基本思想是通過數(shù)據(jù)間的相似性,按相似性由高到低排序后重新連接各個節(jié)點(diǎn),整個過程就是建立一個樹結(jié)構(gòu),如下圖:

      數(shù)據(jù)挖掘——聚類分析總結(jié)(建議收藏)

      層次聚類算法的步驟:

      • 每個數(shù)據(jù)點(diǎn)單獨(dú)作為一個類
      • 計算各點(diǎn)之間的距離(相似度)
      • 按照距離從小到大(相似度從強(qiáng)到弱)連接成對(連接后按兩點(diǎn)的均值作為新類繼續(xù)計算),得到樹結(jié)構(gòu)

      基于sklearn包的實(shí)現(xiàn)

      使用K-Means聚類案例中的數(shù)據(jù)

      cloumns_fix1 = ['工作日上班時電話時長', '工作日下半時電話時長', '周末電話時長', '國際電話時長', '平均每次通話時長']linkage = hcluster.linkage(data[cloumns_fix1], method='centroid') #中心點(diǎn)距離計算,得到矩陣

      linkage = scipy.cluster.hierarchy.linkage(data, method='single')

      method 類距離計算公式有三種參數(shù):
          single 兩個類之間最短距離的點(diǎn)的距離
          complete 兩個類之間最長距離的點(diǎn)的距離
          centroid 兩個類所有點(diǎn)的中點(diǎn)的距離

      #層次聚類繪圖hcluster.dendrogram(linkage)  #不設(shè)置參數(shù)時會將所有點(diǎn)做為一個基礎(chǔ)的類進(jìn)行樹結(jié)構(gòu)的繪制#由于數(shù)據(jù)量大,限制類的個數(shù),保留12個節(jié)點(diǎn),有括號表示副節(jié)點(diǎn),括號內(nèi)的數(shù)字為該節(jié)點(diǎn)內(nèi)部包含的子節(jié)點(diǎn)hcluster.dendrogram(linkage, truncate_mode='lastp', p=12, leaf_font_size=12.)

      數(shù)據(jù)挖掘——聚類分析總結(jié)(建議收藏)

      #對聚類得到的類進(jìn)行標(biāo)注 層次聚類的結(jié)果,要聚類的個數(shù),劃分方法(maxclust,最大劃分法)ptarget = hcluster.fcluster(linkage, 3, criterion='maxclust')#查看各類別中樣本含量pd.crosstab(ptarget,ptarget)

      數(shù)據(jù)挖掘——聚類分析總結(jié)(建議收藏)

      繪制圖形

      #使用主成分分析進(jìn)行數(shù)據(jù)降維pca_2 = PCA(n_components=2)data_pca_2 = pd.DataFrame(pca_2.fit_transform(data[cloumns_fix1]))plt.scatter(data_pca_2[0], data_pca_2[1], c=ptarget) #繪制圖形

      3、 DBSCAN密度法

      概念:

      中文全稱:基于密度的帶噪聲的空間聚類應(yīng)用算法,它是將簇定義為密度相聯(lián)的點(diǎn)的最大集合,能夠把具有足夠高密度的區(qū)域劃分為簇,并可在噪聲的空間數(shù)據(jù)集中發(fā)現(xiàn)任意形狀的聚類。

      密度:空間中任意一點(diǎn)的密度是以該點(diǎn)為圓心,以Eps為半徑的園區(qū)域內(nèi)包含的點(diǎn)數(shù)目。

      鄰域:空間中任意一點(diǎn)的鄰域是以該店為圓心,以Eps為半徑的園區(qū)域內(nèi)包含的點(diǎn)集合。

      核心點(diǎn):空間中某一點(diǎn)的密度,如果大于某一給定閾值MinPts,則稱該點(diǎn)為核心點(diǎn)。(小于MinPts則稱邊界點(diǎn))

      噪聲點(diǎn):既不是核心點(diǎn),也不是邊界點(diǎn)的任意點(diǎn)

      DBSCAN算法的步驟:

      • 通過檢查數(shù)據(jù)集中每點(diǎn)的Eps鄰域來搜索簇,如果點(diǎn)p的Eps鄰域內(nèi)包含的點(diǎn)多于MinPts個,則創(chuàng)建一個以p為核心的簇
      • 通過迭代聚集這些核心點(diǎn)p距離Eps內(nèi)的點(diǎn),然后合并成為新的簇(可能)
      • 當(dāng)沒有新點(diǎn)添加到新的簇時,聚類完成

      DBSCAN算法優(yōu)點(diǎn):

      • 聚類速度快且能夠有效處理噪聲點(diǎn)發(fā)現(xiàn)任意形狀的空間聚類
      • 不需要輸入要劃分的聚類個數(shù)
      • 聚類簇的形狀沒有偏倚
      • 可以在需要是過濾噪聲

      DBSCAN算法缺點(diǎn):

      • 數(shù)據(jù)量大時,需要較大的內(nèi)存和計算時間
      • 當(dāng)空間聚類的密度不均勻、聚類間距差較大時,得到的聚類質(zhì)量較差(MinPts與Eps選取困難)
      • 算法效果依賴距離公式選擇,實(shí)際應(yīng)用中常使用歐式距離,對于高緯度數(shù)據(jù),存在“維度災(zāi)難” https://baike.baidu.com/item/維數(shù)災(zāi)難/6788619?fr=aladdin

      python中的實(shí)現(xiàn)

      1)數(shù)學(xué)原理實(shí)現(xiàn)

      導(dǎo)入一份如下分布的數(shù)據(jù)點(diǎn)的集合

      數(shù)據(jù)挖掘——聚類分析總結(jié)(建議收藏)

      #計算得到各點(diǎn)間距離的矩陣from sklearn.metrics.pairwise import euclidean_distancesdist = euclidean_distances(data)

      將所有點(diǎn)進(jìn)行分類,得到核心點(diǎn)、邊界點(diǎn)和噪聲點(diǎn)

      #設(shè)置Eps和MinPtseps = 0.2MinPts = 5ptses = []for row in dist: #密度 density = np.sum(row<eps) pts = 0 if density>MinPts:   #核心點(diǎn),密度大于5 pts = 1 elif density>1 : #邊界點(diǎn),密度大于1小于5 pts = 2 else: #噪聲點(diǎn),密度為1 pts = 0 ptses.append(pts)#得到每個點(diǎn)的分類

      以防萬一,將噪聲點(diǎn)進(jìn)行過濾,并計算新的距離矩陣

      #把噪聲點(diǎn)過濾掉,因?yàn)樵肼朁c(diǎn)無法聚類,它們獨(dú)自一類corePoints = data[pandas.Series(ptses)!=0]coreDist = euclidean_distances(corePoints)

      以每個點(diǎn)為核心,得到該點(diǎn)的鄰域

      cluster = dict()i = 0for row in coreDist: cluster[i] = numpy.where(row<eps)[0] i = i + 1

      然后,將有交集的鄰域,都合并為新的領(lǐng)域

      for i in range(len(cluster)):    for j in range(len(cluster)):        if len(set(cluster[j]) & set(cluster[i]))>0 and i!=j:            cluster[i] = list(set(cluster[i]) | set(cluster[j]))            cluster[j] = list()

      最后,找出獨(dú)立(也就是沒有交集)的鄰域,就是我們最后的聚類的結(jié)果了

      result = dict()j = 0for i in range(len(cluster)): if len(cluster[i])>0: result[j] = cluster[i] j = j + 1#找出每個點(diǎn)所在領(lǐng)域的序號,作為他們最后聚類的結(jié)果標(biāo)記for i in range(len(result)): for j in result[i]: data.at[j, 'type'] = i plt.scatter(data['x'], data['y'], c=data['type'])

      數(shù)據(jù)挖掘——聚類分析總結(jié)(建議收藏)

      2)基于sklearn包的實(shí)現(xiàn)

      eps = 0.2MinPts = 5model = DBSCAN(eps, MinPts)data['type'] = model.fit_predict(data)plt.scatter(data['x'],  data['y'], c=data['type'])

      end.

      來源:博客園


        本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多