วิธีการใช้ทั้งไบนารีและตัวแปรต่อเนื่องร่วมกันในการจัดกลุ่ม?


27

ฉันต้องการใช้ตัวแปรไบนารี (ค่า 0 & 1) ใน k-mean แต่ k-mean ใช้งานได้กับตัวแปรต่อเนื่องเท่านั้น ฉันรู้ว่าบางคนยังคงใช้ตัวแปรไบนารีเหล่านี้ใน k-mean โดยไม่สนใจข้อเท็จจริงที่ว่า k-หมายความว่าถูกออกแบบมาสำหรับตัวแปรต่อเนื่องเท่านั้น นี่เป็นสิ่งที่ฉันยอมรับไม่ได้

คำถาม:

  1. ดังนั้นวิธีที่ถูกต้องทางสถิติ / ทางคณิตศาสตร์ของการใช้ตัวแปรไบนารีในการจัดกลุ่ม k- หมายถึง / ลำดับชั้นคืออะไร?
  2. วิธีการนำโซลูชันไปใช้ใน SAS / R

1
ฉันอยากรู้เกี่ยวกับแหล่งที่มาของข้อมูลของคุณว่า "K แปลว่าออกแบบมาสำหรับตัวแปรต่อเนื่องเท่านั้น" คุณจะสามารถอ้างอิงการอ้างอิงได้หรือไม่?
whuber

2
jmp.com/support/help/K-Means_Clustering.shtml "การทำคลัสเตอร์ K-Means รองรับเฉพาะคอลัมน์ตัวเลขเท่านั้น K-หมายถึงการรวมกลุ่มจะไม่สนใจประเภทรูปแบบ (ชื่อและลำดับ) และถือว่าคอลัมน์ตัวเลขทั้งหมดเป็นคอลัมน์ต่อเนื่อง" ฉันเพิ่งไปและได้รับสิ่งนี้ จุดคือค่าเฉลี่ยถูกกำหนดไว้สำหรับตัวแปรต่อเนื่องที่ไม่ใช่ไบนารีดังนั้น k หมายถึงไม่สามารถใช้ตัวแปรไบนารีได้
GeorgeOfTheRF

1
มันสามารถใช้พวกเขาโดยการรักษาพวกเขาอย่างต่อเนื่อง; แต่การตีความผลลัพธ์จะยากเนื่องจากศูนย์คลัสเตอร์จะไม่มีค่าไบนารีอีกต่อไป และ IMHO เป็นสิ่งที่ชัดเจน แต่ถ้าผลลัพธ์มีความหมายมากเกินไป - ทำไมการลดความแปรปรวนของตัวแปรไบนารีจึงสมเหตุสมผล ให้พิจารณาเช่นการขุดชุดสิ่งของ freuqent ในตัวแปรไบนารี่หากตรงกับที่มีอยู่ / หายไปเพื่อค้นหารูปแบบในข้อมูลของคุณ
Anony-Mousse

มีอะไรอีกที่คุณต้องการนอกเหนือจากคำตอบด้านล่าง? สิ่งนี้ได้รับมาเป็นเวลานาน & ได้รับการดูอย่างสูง & อัปโหลด แต่ไม่ชัดเจนว่าคำถามของคุณได้รับการแก้ไขตามความพึงพอใจของคุณแล้วและไม่มีข้อบ่งชี้ว่าคุณอาจยังขาดอะไรอยู่
gung - Reinstate Monica

คำตอบ:


31

คุณมีสิทธิ์ที่การจัดกลุ่ม k หมายถึงไม่ควรทำกับข้อมูลประเภทผสม เนื่องจาก k-mean นั้นเป็นอัลกอริธึมการค้นหาแบบง่าย ๆ เพื่อค้นหาพาร์ติชันที่ลดระยะห่างระหว่างยูคลิดสแควร์ภายในกระจุกระหว่างการสังเกตแบบกระจุกดาวกับคลัสเตอร์เซนทรอยด์ดังนั้นจึงควรใช้กับข้อมูลที่ระยะทางยูคลิด

เมื่อข้อมูลของคุณประกอบด้วยตัวแปรประเภทผสมคุณต้องใช้ระยะทางของโกเวอร์ @ttnphns ใช้ CV มีภาพรวมที่ดีของระยะทางโกเวอร์ที่นี่ ในสาระสำคัญคุณคำนวณเมทริกซ์ระยะทางสำหรับแถวของคุณสำหรับแต่ละตัวแปรในทางกลับกันโดยใช้ชนิดของระยะทางที่เหมาะสมสำหรับตัวแปรประเภทนั้น (เช่น Euclidean สำหรับข้อมูลต่อเนื่องเป็นต้น); ระยะทางสุดท้ายของแถวถึงคือค่าเฉลี่ยของระยะทางสำหรับตัวแปรแต่ละตัว สิ่งหนึ่งที่ต้องระวังก็คือว่าระยะทางโกเวอร์ไม่จริงตัวชี้วัด อย่างไรก็ตามด้วยข้อมูลที่หลากหลายระยะทางของโกเวอร์จึงเป็นเกมเดียวในเมือง ผมผม'

ณ จุดนี้คุณสามารถใช้วิธีการจัดกลุ่มใด ๆ ที่สามารถทำงานบนเมทริกซ์ระยะทางแทนการต้องการเมทริกซ์ข้อมูลดั้งเดิม (โปรดทราบว่า k- หมายถึงต้องการหลัง) ตัวเลือกที่นิยมมากที่สุดคือการแบ่งรอบยาเม็ด (PAM ซึ่งเป็นหลักเช่นเดียวกับ k- หมายถึง แต่ใช้การสังเกตกลางมากที่สุดมากกว่าเซนทรอยด์) วิธีการจัดกลุ่มแบบลำดับชั้นต่างๆ(เช่น มัธยฐานการเชื่อมโยงเดี่ยวและการเชื่อมโยงแบบสมบูรณ์ด้วยการจัดกลุ่มแบบลำดับชั้นคุณจะต้องตัดสินใจว่าจะ ' ตัดต้นไม้ ' เพื่อให้ได้รับการมอบหมายคลัสเตอร์สุดท้าย) และDBSCANซึ่งช่วยให้รูปร่างคลัสเตอร์มีความยืดหยุ่นมากขึ้น

นี่คือตัวอย่างง่ายๆR(nb, จริงๆแล้วมี 3 กลุ่ม แต่ข้อมูลส่วนใหญ่ดูเหมือนว่า 2 กลุ่มมีความเหมาะสม):

library(cluster)  # we'll use these packages
library(fpc)

  # here we're generating 45 data in 3 clusters:
set.seed(3296)    # this makes the example exactly reproducible
n      = 15
cont   = c(rnorm(n, mean=0, sd=1),
           rnorm(n, mean=1, sd=1),
           rnorm(n, mean=2, sd=1) )
bin    = c(rbinom(n, size=1, prob=.2),
           rbinom(n, size=1, prob=.5),
           rbinom(n, size=1, prob=.8) )
ord    = c(rbinom(n, size=5, prob=.2),
           rbinom(n, size=5, prob=.5),
           rbinom(n, size=5, prob=.8) )
data   = data.frame(cont=cont, bin=bin, ord=factor(ord, ordered=TRUE))
  # this returns the distance matrix with Gower's distance:  
g.dist = daisy(data, metric="gower", type=list(symm=2))

เราสามารถเริ่มต้นด้วยการค้นหากลุ่มที่แตกต่างกันด้วย PAM:

  # we can start by searching over different numbers of clusters with PAM:
pc = pamk(g.dist, krange=1:5, criterion="asw")
pc[2:3]
# $nc
# [1] 2                 # 2 clusters maximize the average silhouette width
# 
# $crit
# [1] 0.0000000 0.6227580 0.5593053 0.5011497 0.4294626
pc = pc$pamobject;  pc  # this is the optimal PAM clustering
# Medoids:
#      ID       
# [1,] "29" "29"
# [2,] "33" "33"
# Clustering vector:
#  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 
#  1  1  1  1  1  2  1  1  1  1  1  2  1  2  1  2  2  1  1  1  2  1  2  1  2  2 
# 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 
#  1  2  1  2  2  1  2  2  2  2  1  2  1  2  2  2  2  2  2 
# Objective function:
#     build      swap 
# 0.1500934 0.1461762 
# 
# Available components:
# [1] "medoids"    "id.med"     "clustering" "objective"  "isolation" 
# [6] "clusinfo"   "silinfo"    "diss"       "call" 

ผลลัพธ์เหล่านั้นสามารถนำมาเปรียบเทียบกับผลลัพธ์ของการจัดกลุ่มแบบลำดับชั้น:

hc.m = hclust(g.dist, method="median")
hc.s = hclust(g.dist, method="single")
hc.c = hclust(g.dist, method="complete")
windows(height=3.5, width=9)
  layout(matrix(1:3, nrow=1))
  plot(hc.m)
  plot(hc.s)
  plot(hc.c)

ป้อนคำอธิบายรูปภาพที่นี่

วิธีมัธยฐานแนะนำกลุ่ม 2 (อาจเป็น 3) กลุ่มเดียวสนับสนุนเพียง 2 แต่วิธีที่สมบูรณ์สามารถแนะนำ 2, 3 หรือ 4 ต่อสายตาของฉัน

ในที่สุดเราสามารถลอง DBSCAN สิ่งนี้ต้องการระบุพารามิเตอร์สองตัว: eps, 'ระยะทางที่เข้าถึงได้' (การเชื่อมโยงการสังเกตสองวิธีจะต้องเชื่อมโยงเข้าด้วยกัน) และ minPts (จำนวนจุดต่ำสุดที่ต้องเชื่อมต่อกันก่อนที่คุณจะเรียกพวกมันว่า 'กลุ่ม') กฎง่ายๆสำหรับ minPts คือการใช้มากกว่าหนึ่งขนาด (ในกรณีของเรา 3 + 1 = 4) แต่ไม่แนะนำให้มีตัวเลขที่เล็กเกินไป ค่าเริ่มต้นสำหรับdbscanคือ 5; เราจะยึดติดกับสิ่งนั้น วิธีคิดอย่างหนึ่งเกี่ยวกับระยะทางที่เข้าถึงได้คือดูว่าเปอร์เซ็นต์ของระยะทางใดที่น้อยกว่าค่าที่กำหนด เราสามารถทำได้โดยตรวจสอบการกระจายของระยะทาง:

windows()
  layout(matrix(1:2, nrow=1))
  plot(density(na.omit(g.dist[upper.tri(g.dist)])), main="kernel density")
  plot(ecdf(g.dist[upper.tri(g.dist)]), main="ECDF")

ป้อนคำอธิบายรูปภาพที่นี่

ระยะทางนั้นดูเหมือนว่าจะรวมกลุ่มเป็นกลุ่มที่มองเห็นได้ชัดเจนว่า 'ใกล้กว่า' และ 'อยู่ห่างไกลออกไป' ค่า. 3 น่าจะแยกความแตกต่างระหว่างสองกลุ่มของระยะทาง หากต้องการสำรวจความอ่อนไหวของเอาต์พุตต่อตัวเลือก eps ที่แตกต่างกันเราสามารถลอง. 0.2 และ. 4 เช่นกัน:

dbc3 = dbscan(g.dist, eps=.3, MinPts=5, method="dist");  dbc3
# dbscan Pts=45 MinPts=5 eps=0.3
#        1  2
# seed  22 23
# total 22 23
dbc2 = dbscan(g.dist, eps=.2, MinPts=5, method="dist");  dbc2
# dbscan Pts=45 MinPts=5 eps=0.2
#         1  2
# border  2  1
# seed   20 22
# total  22 23
dbc4 = dbscan(g.dist, eps=.4, MinPts=5, method="dist");  dbc4
# dbscan Pts=45 MinPts=5 eps=0.4
#        1
# seed  45
# total 45

การใช้eps=.3ทำให้ได้โซลูชั่นที่สะอาดมากซึ่งอย่างน้อยก็เห็นด้วยกับสิ่งที่เราเห็นจากวิธีอื่นข้างต้น

เนื่องจากไม่มีคลัสเตอร์ที่มีความหมาย1-nessเราควรระมัดระวังในการพยายามจับคู่การสังเกตที่เรียกว่า 'คลัสเตอร์ 1' จากการรวมกลุ่มที่แตกต่างกัน แต่เราสามารถสร้างตารางและหากการสังเกตส่วนใหญ่ที่เรียกว่า 'คลัสเตอร์ 1' ในแบบเต็มเรียกว่า 'คลัสเตอร์ 2' ในแบบอื่นเราจะเห็นว่าผลลัพธ์ยังคงเหมือนเดิม ในกรณีของเรากลุ่มที่แตกต่างกันส่วนใหญ่จะมีเสถียรภาพมากและทำให้การสังเกตเดียวกันในกลุ่มเดียวกันในแต่ละครั้ง; เฉพาะการเชื่อมโยงแบบลำดับชั้นที่สมบูรณ์ของการทำคลัสเตอร์แตกต่างกัน:

  # comparing the clusterings
table(cutree(hc.m, k=2), cutree(hc.s, k=2))
#    1  2
# 1 22  0
# 2  0 23
table(cutree(hc.m, k=2), pc$clustering)
#    1  2
# 1 22  0
# 2  0 23
table(pc$clustering, dbc3$cluster)
#    1  2
# 1 22  0
# 2  0 23
table(cutree(hc.m, k=2), cutree(hc.c, k=2))
#    1  2
# 1 14  8
# 2  7 16

แน่นอนไม่มีการรับประกันว่าการวิเคราะห์กลุ่มใด ๆ จะกู้คืนกลุ่มแฝงจริงในข้อมูลของคุณ การไม่มีเลเบลคลัสเตอร์จริง (ซึ่งจะพร้อมใช้งานในสถานการณ์การถดถอยแบบโลจิสติกส์) หมายความว่าไม่มีข้อมูลจำนวนมหาศาล แม้ว่าจะมีชุดข้อมูลที่มีขนาดใหญ่มาก แต่กลุ่มอาจไม่ได้รับการแยกออกมาเพียงพอที่จะกู้คืนได้อย่างสมบูรณ์แบบ ในกรณีของเราเนื่องจากเรารู้ว่าการเป็นสมาชิกคลัสเตอร์ที่แท้จริงเราสามารถเปรียบเทียบสิ่งนั้นกับผลลัพธ์เพื่อดูว่ามันทำได้ดีเพียงใด ดังที่ฉันได้กล่าวไว้ข้างต้นจริง ๆ แล้วมีกลุ่มที่แฝงอยู่ 3 กลุ่ม แต่ข้อมูลให้ลักษณะของกลุ่มที่ 2 แทน:

pc$clustering[1:15]    # these were actually cluster 1 in the data generating process
# 1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 
# 1  1  1  1  1  2  1  1  1  1  1  2  1  2  1 
pc$clustering[16:30]   # these were actually cluster 2 in the data generating process
# 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 
#  2  2  1  1  1  2  1  2  1  2  2  1  2  1  2 
pc$clustering[31:45]   # these were actually cluster 3 in the data generating process
# 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 
#  2  1  2  2  2  2  1  2  1  2  2  2  2  2  2 

ที่การจัดกลุ่มแบบลำดับชั้นที่คุณพูดถึงmedian method suggests 2 (possibly 3) clusters, the single only supports 2, but the complete method could suggest 2, 3 or 4.. คุณมาถึงที่นี้ได้อย่างไร ใช้ความสูง 0.3?
lukeg

1
@ lukeg ความสูงของการรวมใน dendrogram แสดงว่าคุณต้องไปรวมกัน 2 กลุ่ม คุณกำลังมองหาว่าระยะทางไกลเท่าไรเพื่อดำเนินการจับกลุ่มต่อไป มันอาจจะช่วยในการอ่านกระทู้ที่ปรึกษาเรื่องนี้ที่นี่และ / หรือที่นี่
gung - Reinstate Monica

2

ดูที่กระดาษนี้โดยกระจอกhttp://www.jds-online.com/files/JDS-192.pdf มันอธิบายว่าทำไมการใช้วิธีการแบบต่อเนื่องกับข้อมูลไบนารีอาจจัดกลุ่มข้อมูลไม่ถูกต้องและที่สำคัญกว่านั้นคือตัวเลือกบางอย่างในฟังก์ชันระยะทางที่เหมาะสม ไม่ตอบวิธีการทำคลัสเตอร์ด้วย k-mean แต่จะทำการจัดกลุ่มข้อมูลไบนารีอย่างถูกต้องโดยใช้ตัวชี้วัดที่ไม่ใช่แบบยูคลิดและวิธีการลำดับชั้นเช่น Ward

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.