클러스터링의 데이터 출력을 플롯하는 방법은 무엇입니까?


15

데이터 세트 (마크 세트)를 클러스터링하려고 시도하고 2 개의 클러스터를 얻었습니다. 그래픽으로 표현하고 싶습니다. (x, y) 좌표가 없기 때문에 표현에 대해 약간 혼란 스럽습니다.

또한 MATLAB / Python 함수를 찾고 있습니다.

편집하다

데이터를 게시하면 질문이 더 명확 해집니다. 파이썬에서 kmeans 클러스터링을 사용하여 만든 두 개의 클러스터가 있습니다 (scipy를 사용하지 않음). 그들은

class 1: a=[3222403552.0, 3222493472.0, 3222491808.0, 3222489152.0, 3222413632.0, 
3222394528.0, 3222414976.0, 3222522768.0, 3222403552.0, 3222498896.0, 3222541408.0, 
3222403552.0, 3222402816.0, 3222588192.0, 3222403552.0, 3222410272.0, 3222394560.0, 
3222402704.0, 3222298192.0, 3222409264.0, 3222414688.0, 3222522512.0, 3222404096.0, 
3222486720.0, 3222403968.0, 3222486368.0, 3222376320.0, 3222522896.0, 3222403552.0, 
3222374480.0, 3222491648.0, 3222543024.0, 3222376848.0, 3222403552.0, 3222591616.0, 
3222376944.0, 3222325568.0, 3222488864.0, 3222548416.0, 3222424176.0, 3222415024.0, 
3222403552.0, 3222407504.0, 3222489584.0, 3222407872.0, 3222402736.0, 3222402032.0, 
3222410208.0, 3222414816.0, 3222523024.0, 3222552656.0, 3222487168.0, 3222403728.0, 
3222319440.0, 3222375840.0, 3222325136.0, 3222311568.0, 3222491984.0, 3222542032.0, 
3222539984.0, 3222522256.0, 3222588336.0, 3222316784.0, 3222488304.0, 3222351360.0, 
3222545536.0, 3222323728.0, 3222413824.0, 3222415120.0, 3222403552.0, 3222514624.0, 
3222408000.0, 3222413856.0, 3222408640.0, 3222377072.0, 3222324304.0, 3222524016.0, 
3222324000.0, 3222489808.0, 3222403552.0, 3223571920.0, 3222522384.0, 3222319712.0, 
3222374512.0, 3222375456.0, 3222489968.0, 3222492752.0, 3222413920.0, 3222394448.0, 
3222403552.0, 3222403552.0, 3222540576.0, 3222407408.0, 3222415072.0, 3222388272.0, 
3222549264.0, 3222325280.0, 3222548208.0, 3222298608.0, 3222413760.0, 3222409408.0, 
3222542528.0, 3222473296.0, 3222428384.0, 3222413696.0, 3222486224.0, 3222361280.0, 
3222522640.0, 3222492080.0, 3222472144.0, 3222376560.0, 3222378736.0, 3222364544.0, 
3222407776.0, 3222359872.0, 3222492928.0, 3222440496.0, 3222499408.0, 3222450272.0, 
3222351904.0, 3222352480.0, 3222413952.0, 3222556416.0, 3222410304.0, 3222399984.0, 
3222494736.0, 3222388288.0, 3222403552.0, 3222323824.0, 3222523616.0, 3222394656.0, 
3222404672.0, 3222405984.0, 3222490432.0, 3222407296.0, 3222394720.0, 3222596624.0, 
3222597520.0, 3222598048.0, 3222403552.0, 3222403552.0, 3222403552.0, 3222324448.0, 
3222408976.0, 3222448160.0, 3222366320.0, 3222489344.0, 3222403552.0, 3222494480.0, 
3222382032.0, 3222450432.0, 3222352000.0, 3222352528.0, 3222414032.0, 3222728448.0, 
3222299456.0, 3222400016.0, 3222495056.0, 3222388848.0, 3222403552.0, 3222487568.0, 
3222523744.0, 3222394624.0, 3222408112.0, 3222406496.0, 3222405616.0, 3222592160.0, 
3222549360.0, 3222438560.0, 3222597024.0, 3222597616.0, 3222598128.0, 3222403552.0, 
3222403552.0, 3222403552.0, 3222499056.0, 3222408512.0, 3222402064.0, 3222368992.0, 
3222511376.0, 3222414624.0, 3222554816.0, 3222494608.0, 3222449792.0, 3222351952.0, 
3222352272.0, 3222394736.0, 3222311856.0, 3222414288.0, 3222402448.0, 3222401056.0, 
3222413568.0, 3222298848.0, 3222297184.0, 3222488000.0, 3222490528.0, 3222394688.0, 
3222408224.0, 3222406672.0, 3222404896.0, 3222443120.0, 3222403552.0, 3222596400.0, 
3222597120.0, 3222597712.0, 3222400896.0, 3222403552.0, 3222403552.0, 3222403552.0, 
3222299200.0, 3222321296.0, 3222364176.0, 3222602208.0, 3222513040.0, 3222414656.0, 
3222564864.0, 3222407904.0, 3222449984.0, 3222352096.0, 3222352432.0, 3222452832.0, 
3222368560.0, 3222414368.0, 3222399376.0, 3222298352.0, 3222573152.0, 3222438080.0, 
3222409168.0, 3222523488.0, 3222394592.0, 3222405136.0, 3222490624.0, 3222406928.0, 
3222407104.0, 3222442464.0, 3222403552.0, 3222596512.0, 3222597216.0, 3222597968.0, 
3222438208.0, 3222403552.0, 3222403552.0, 3222403552.0]

class 2: b=[3498543128.0, 3498542920.0, 3498543252.0, 3498543752.0, 3498544872.0, 
3498544528.0, 3498543024.0, 3498542548.0, 3498542232.0]

플롯하고 싶습니다. 나는 다음을 시도하고 나는 플롯 할 때 다음과 같은 결과를 가지고 ab.

pylab.plot(a,'x')
pylab.plot(b,'o')
pylab.show()

여기에 이미지 설명을 입력하십시오

더 나은 클러스터링 시각화를 얻을 수 있습니까?


1
그것은 실제로 당신이 클러스터링을 수행 한 것에 달려 있습니다 :) 당신이 데이터의 작은 예를 보여 주면 당신은 대답을 얻을 것이라고 확신합니다
david w

1
다른 색상과 마커를 사용하는 것이 가장 간단하고 읽기 쉬운 경향이 있습니다. 당신이 가진 모든 것이 2 군집이라면, 당신은 다른 값으로 0/1 또는 O / X를 인쇄 할 수 있습니다.
Marcin

"마크 세트"라는 말의 의미를 알려주십시오. 군집을 특성화 할 변수는 몇 개입니까? 또한 2 개가 사용하기에 가장 좋은 클러스터 수라고 확신하십니까? 여러 번 클러스터 분석 프로그램을 반복적으로 사용해야합니다. 처음에는 하나만 얻을 수 있지만 일부 조정을 사용하면 더 흥미롭고 유익한 숫자를 얻을 수 있습니다.
rolando2

필자는 군집 수를 명시 적으로 지정해야하는 kmeans를 사용했습니다.
user2721

@ user2721, kmeans를 어떻게 사용하는지 알려 주시겠습니까?
Sigur

답변:


30

일반적으로 산점도 (또는 산점도가 많은 경우 산점도 행렬)에 원래 값을 플로팅하고 색상을 사용하여 그룹을 표시합니다.

파이썬으로 대답을 요청했으며 실제로 scipy, numpy 및 matplotlib을 사용하여 모든 클러스터링 및 플로팅을 수행합니다.

데이터를 만들어서 시작

import numpy as np
from scipy import cluster
from matplotlib import pyplot

np.random.seed(123)
tests = np.reshape( np.random.uniform(0,100,60), (30,2) )
#tests[1:4]
#array([[ 22.68514536,  55.13147691],
#       [ 71.94689698,  42.31064601],
#       [ 98.07641984,  68.48297386]])

클러스터는 몇 개입니까?

이것은 k- 평균에 대한 어려운 점이며 많은 방법이 있습니다. 팔꿈치 방법을 사용합시다

#plot variance for each value for 'k' between 1,10
initial = [cluster.vq.kmeans(tests,i) for i in range(1,10)]
pyplot.plot([var for (cent,var) in initial])
pyplot.show()

팔꿈치 줄거리

관측치를 수업에 배정하고 작도

나는 인덱스 3 (즉, 4 개의 클러스터)이 그렇게 좋은 것으로 생각합니다.

cent, var = initial[3]
#use vq() to get as assignment for each obs.
assignment,cdist = cluster.vq.vq(tests,cent)
pyplot.scatter(tests[:,0], tests[:,1], c=assignment)
pyplot.show()

산포도

이미 수행 한 작업을 해당 워크 플로우에 집어 넣을 수있는 곳에서 운동하십시오 (클러스터가 임의의 클러스터보다 조금 더 좋기를 바랍니다).


당신의 대답은 훌륭해 보입니다. 내 데이터에 효율적으로 사용할 수 있습니까? 시도 할 시간이 없습니다.
user2721

@ david w : 이것은 내가 본 최고의 답변 중 하나입니다! 독립형 예제를 게시 해 주셔서 감사합니다. 적어도, 나는 당신의 대답의 요점을 이해합니다 :) 다시 한번 감사합니다!
Legend

@ david w : 내가 가진 유일한 질문은 팔꿈치 방법이 값이 증가하고 플롯이 감소하는 것입니다. kmeans에서 직접 왜곡 값을 사용하고 있기 때문입니까? Wikipedia의 팔꿈치 플롯처럼 보이도록 어떻게 변환 할 수 있습니까? 그리고 마지막 질문으로 kmeans 대신 kmeans2에 대해이 작업을 수행하는 방법을 알고 싶습니까?
Legend

첫 번째 줄거리를 찾고있는 인덱스 3 을 발견 했습니까?
Sigur

2

아마도 Fastmap 과 같은 것을 시도해보십시오 하여 상대 거리를 사용하여 마크 세트를 플로팅하십시오.

(아직도) 영리한 것은 없다 문자열을 플롯하기 위해 파이썬에서 Fastmap을 작성하는 자신의 거리 측정법을 작성한 경우 속성 목록을 처리하도록 쉽게 업데이트 할 수 있습니다.

아래는 두 가지 속성 목록을 매개 변수로 사용하는 표준 유클리드 거리입니다. 목록에 클래스 값이 있으면 거리 계산에 사용하지 마십시오.

def distance(vecone, vectwo, d=0.0):
    for i in range(len(vecone)):
        if isnumeric(vecone[i]):
            d = d + (vecone[i] - vectwo[i])**2
        elif vecone[i] is not vectwo[i]:
            d += 1.0
    return math.sqrt(d)

def isnumeric(s):
    try:
        float(s)
        return True
    except ValueError:
        return False

0

나는 파이썬 전문가가 아니지만 x, y 축에서 서로에 대해 첫 번째 2 차 주요 구성 요소를 그리는 것이 매우 도움이됩니다.

어떤 패키지를 사용하고 있는지 확실하지 않지만 샘플 링크는 다음과 같습니다.

http://pyrorobotics.org/?page=PyroModuleAnalysis


저는 통계 전문가가 아닙니다. 플로팅 아이디어에 대해 더 자세히 설명해 주시겠습니까?
user2721

기본 아이디어는 많은 변수가 서로 상관되며 모든 것이 서로 상관되지 않은 두 변수로만 축소 될 수 있으며 데이터의 변동에 대해 "가장 많이"설명 할 수 있다는 것입니다. 주성분 분석을 읽고이를 구현할 수있는 패키지를 적용해야합니다. en.wikipedia.org/wiki/Principal_component_analysis
랄프 윈터스
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.