熱線電話:13121318867

登錄
首頁精彩閱讀一篇文章透徹解讀聚類分析及案例實操(二)
一篇文章透徹解讀聚類分析及案例實操(二)
2016-04-05
收藏

一篇文章透徹解讀聚類分析及案例實操(二)

4  SAS聚類分析案例

1 問題背景

考慮下面案例,一個棒球管理員希望根據隊員們的興趣相似性將他們進行分組。顯然,在該例子中,沒有響應變量。管理者希望能夠方便地識別出隊員的分組情況。同時,他也希望了解不同組之間隊員之間的差異性。

該案例的數據集是在SAMPSIO庫中的DMABASE數據集。下面是數據集中的主要的變量的描述信息:

在這個案例中,設置TEAM,POSITION,LEAGUE,DIVISION和SALARY變量的模型角色為rejected,設置SALARY變量的 模型角色為rejected是由于它的信息已經存儲在LOGSALAR中。在聚類分析和自組織映射圖中是不需要目標變量的。如果需要在一個目標變量上識別 分組,可以考慮預測建模技術或者定義一個分類目標。

2 聚類方法概述

聚類分析經常和有監督分類相混淆,有監督分類是為定義的分類響應變量預測分組或者類別關系。而聚類分析,從另一方面考慮,它是一種無監督分類技術。 它能夠在所有輸入變量的基礎上識別出數據集中的分組和類別信息。這些組、簇,賦予不同的數字。然而,聚類數目不能用來評價類別之間的近似關系。自組織映射 圖嘗試創建聚類,并且在一個圖上用圖形化的方式繪制出聚類信息,在此處我們并沒有考慮。

1) 建立初始數據流

2) 設置輸入數據源結點

打開輸入數據源結點

從SAMPSIO庫中選擇DMABASE數據集

設置NAME變量的模型角色為id,TEAM,POSIOTION,LEAGUE,DIVISION和SALARY變量的模型角色為rejected

探索變量的分布和描述性統計信息

選擇區間變量選項卡,可以觀察到只有LOGSALAR和SALARY變量有缺失值。選擇類別變量選項卡,可以觀察到沒有缺失值。在本例中,沒有涉及到任何類別變量。

關閉輸入數據源結點,并保存信息。

3) 設置替代結點

雖然并不是總是要處理缺失值,但是有時候缺失值的數量會影響聚類結點產生的聚類解決方案。為了產生初始聚類,聚類結點往往需要一些完整的觀測值。當缺失值太多的時候,需要用替代結點來處理。雖然這并不是必須的,但是在本例中使用到了。

4) 設置聚類結點

打開聚類結點,激活變量選項卡。K-means聚類對輸入數據是敏感的。一般情況下,考慮對數據集進行標準化處理。

在變量選項卡,選擇標準偏差單選框

選擇聚類選項卡

觀察到默認選擇聚類數目的方法是自動的

關閉聚類結點

5) 聚類結果

在聚類結點處運行流程圖,查看聚類結果。

6) 限定聚類數目

打開聚類結點

選擇聚類選項卡

在聚類數目選擇部分,點擊選擇標準按鈕

輸入最大聚類數目為10

點擊ok,關閉聚類結點

7)結果解釋

我們可以定義每個類別的信息,結合背景識別每個類型的特征。選擇箭頭按鈕,

選擇三維聚類圖的某一類別,

在工具欄選擇刷新輸入均值圖圖標,

點擊該圖標,可以查看該類別的規范化均值圖

同理,可以根據該方法對其他類別進行解釋。

8)運用Insight結點

Insight結點可以用來比較不同屬性之間的異常。打開insight結點,選擇整個數據集,關閉結點。

從insight結點處運行。

變量_SEGMNT_標識類別,distance標識觀測值到所在類別中心的距離。運用insight窗口的analyze工具評估和比較聚類結果。

首先把_SEGMNT_的度量方式從interval轉換成nominal。


R語言

以R基礎包自帶的鳶尾花(Iris)數據進行聚類分析。分析代碼如下:

###### 代碼清單 #######

data(iris); attach(iris)

iris.hc <- hclust( dist(iris[,1:4]))

# plot( iris.hc, hang = -1)

plclust( iris.hc, labels = FALSE, hang = -1)

re <- rect.hclust(iris.hc, k = 3)

iris.id <- cutree(iris.hc, 3)

table(iris.id, Species)

###### 運行結果 #######

> table(iris.id,Species)

Species

iris.id setosa versicolor virginica

1 50 0 0

2 0 23 49

3 0 27 1

聚類分析生成的圖形如下:

結果表明,函數cuttree()將數據iris分類結果iris.hc編為三組分別以1,2, 3表示,保存在iris.id中。將iris.id與iris中Species作比較發現:1應該是setosa類,2應該是virginica類(因為 virginica的個數明顯多于versicolor),3是versicolor。

仍以R基礎包自帶的鳶尾花(Iris)數據進行K-均值聚類分析,分析代碼如下:

###### 代碼清單 #######

library(fpc)

data(iris)

df<-iris[,c(1:4)]

set.seed(252964) # 設置隨機值,為了得到一致結果。

(kmeans <- kmeans(na.omit(df), 3)) # 顯示K-均值聚類結果

plotcluster(na.omit(df), kmeans$cluster) # 生成聚類圖

生成的圖如下:


Python篇

Python運行條件:

1.Python運行環境與編輯環境;

2.Matplotlib.pyplot圖形庫,可用于快速繪制2D圖表,與matlab中的plot命令類似,而且用法也基本相同。

# coding=utf-8

##

作者:Chan

程序:kmeans算法

##

import matplotlib.pyplot as plt

import math

import numpy

import random

#dotOringalNum為各個分類最初的大小

dotOringalNum=100

#dotAddNum最后測試點的數目

dotAddNum=1000

fig = plt.figure()

ax = fig.add_subplot(111)

sets=

colors=[‘b’,’g’,’r’,’y’]

#第一個分類,顏色為藍色,在左下角

a=

txx=0.0

tyy=0.0

for i in range(0,dotOringalNum):

tx=float(random.randint(1000,3000))/100

ty=float(random.randint(1000,3000))/100

a.append([tx,ty])

txx+=tx

tyy+=ty

#ax.plot([tx],[ty],color=colors[0],linestyle=”,marker=’.’)

#a的第一個元素為a的各個元素xy值之合

a.insert(0,[txx,tyy])

sets.append(a)

#第二個分類,顏色為綠色,在右上角

b=

txx=0.0

tyy=0.0

for i in range(0,dotOringalNum):

tx=float(random.randint(4000,6000))/100

ty=float(random.randint(4000,6000))/100

b.append([tx,ty])

txx+=tx

tyy+=ty

#ax.plot([tx],[ty],color=colors[1],linestyle=”,marker=’.’)

b.insert(0,[txx,tyy])

sets.append(b)

#第三個分類,顏色為紅色,在左上角

c=

txx=0.0

tyy=0.0

for i in range(0,dotOringalNum):

tx=float(random.randint(1000,3000))/100

ty=float(random.randint(4000,6000))/100

c.append([tx,ty])

txx+=tx

tyy+=ty

#ax.plot([tx],[ty],color=colors[2],linestyle=”,marker=’.’)

c.insert(0,[txx,tyy])

sets.append(c)

#第四個分類,顏色為黃色,在右下角

d=

txx=0

tyy=0

for i in range(0,dotOringalNum):

tx=float(random.randint(4000,6000))/100

ty=float(random.randint(1000,3000))/100

d.append([tx,ty])

txx+=tx

tyy+=ty

#ax.plot([tx],[ty],color=colors[3],linestyle=”,marker=’.’)

d.insert(0,[txx,tyy])

sets.append(d)

#測試

for i in range(0,dotAddNum):

tx=float(random.randint(0,7000))/100

ty=float(random.randint(0,7000))/100

dist=9000.0

setBelong=0

for j in range(0,4):

length=len(sets[j])-1

centX=sets[j][0][0]/length

centY=sets[j][0][1]/length

if (centX-tx)*(centX-tx)+(centY-ty)*(centY-ty)

運行效果:


數據分析咨詢請掃描二維碼

若不方便掃碼,搜微信號:CDAshujufenxi

數據分析師資訊
更多

OK
客服在線
立即咨詢
日韩人妻系列无码专区视频,先锋高清无码,无码免费视欧非,国精产品一区一区三区无码
客服在線
立即咨詢