Làm thế nào để vẽ đồ thị đầu ra của phân cụm?


15

Tôi đã thử phân cụm một tập hợp dữ liệu (một tập hợp các dấu) và nhận được 2 cụm. Tôi muốn đại diện đồ họa nó. Bit bối rối về biểu diễn, vì tôi không có tọa độ (x, y).

Cũng đang tìm kiếm hàm MATLAB / Python để làm như vậy.

BIÊN TẬP

Tôi nghĩ rằng việc đăng dữ liệu làm cho câu hỏi rõ ràng hơn. Tôi có hai cụm tôi đã tạo bằng cách sử dụng kmeans clustering trong Python (không sử dụng scipy). họ đang

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]

Tôi muốn vẽ nó. Tôi đã thử sau đây và nhận được kết quả sau khi tôi vẽ ab.

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

nhập mô tả hình ảnh ở đây

Tôi có thể có được một hình dung tốt hơn của cụm?


1
Điều đó thực sự phụ thuộc vào việc bạn đã thực hiện phân cụm :) Nếu bạn hiển thị một ví dụ nhỏ về dữ liệu bạn có chắc chắn bạn sẽ nhận được câu trả lời
david w

1
Sử dụng các màu sắc và điểm đánh dấu khác nhau có xu hướng đơn giản / dễ đọc nhất. Nếu tất cả những gì bạn có là 2 cụm, thì bạn chỉ có thể in 0/1 hoặc O / X cho các giá trị khác nhau.
Marcin

Hãy cho biết ý của bạn là "một bộ nhãn hiệu". Bạn có bao nhiêu biến để mô tả các cụm? Ngoài ra, bạn có tự tin rằng 2 là số cụm tốt nhất để sử dụng không? Nhiều lần người ta phải sử dụng các chương trình phân tích cụm lặp đi lặp lại; ngay từ đầu, người ta có thể chỉ nhận được 2, nhưng với một số điều chỉnh, người ta có thể nhận được một con số cao hơn và thú vị hơn.
rolando2

Tôi đã sử dụng kmeans nơi tôi phải đưa ra số lượng cụm rõ ràng
user2721

@ user2721, bạn có thể chỉ cho chúng tôi cách bạn sử dụng kmeans không?
Sigur

Câu trả lời:


30

Thông thường, bạn sẽ vẽ các giá trị ban đầu trong một biểu đồ phân tán (hoặc một ma trận của các biểu đồ phân tán nếu bạn có nhiều trong số chúng) và sử dụng màu sắc để hiển thị các nhóm của bạn.

Bạn đã yêu cầu một câu trả lời trong python, và bạn thực sự thực hiện tất cả các cụm và âm mưu với scipy, numpy và matplotlib:

Bắt đầu bằng cách tạo một số dữ liệu

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]])

Có bao nhiêu cụm?

Đây là điều khó khăn về phương tiện k, và có rất nhiều phương pháp. Hãy sử dụng phương pháp khuỷu tay

#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()

Âm mưu khuỷu tay

Chỉ định các quan sát của bạn cho các lớp và vẽ đồ thị cho chúng

Tôi nghĩ chỉ số 3 (tức là 4 cụm) là tốt như bất kỳ

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()

âm mưu phân tán

Chỉ cần tìm ra nơi bạn có thể dính bất cứ thứ gì bạn đã thực hiện vào quy trình công việc đó (và tôi hy vọng các cụm của bạn đẹp hơn một chút so với các cụm ngẫu nhiên!)


Câu trả lời của bạn trông tuyệt vời. Tôi có thể sử dụng nó hiệu quả cho dữ liệu của tôi. Không thể có thời gian để thử nó.
dùng2721

@david w: Đây là một trong những câu trả lời hay nhất tôi từng thấy! Cảm ơn bạn rất nhiều vì đã đăng một ví dụ độc lập. Ít nhất, tôi hiểu mấu chốt của câu trả lời của bạn :) Cảm ơn bạn một lần nữa!
Truyền thuyết

@david w: Câu hỏi duy nhất tôi có là phương pháp khuỷu tay hiển thị các giá trị tăng dần và âm mưu của bạn hiển thị giảm. Đây có phải là vì bạn đang sử dụng các giá trị biến dạng trực tiếp từ kmeans? Làm thế nào tôi có thể chuyển đổi nó để trông giống như âm mưu khuỷu tay của Wikipedia? Và như một câu hỏi cuối cùng, bạn có biết làm thế nào để làm điều này cho kmeans2 thay vì kmeans không?
Truyền thuyết

Bạn có phát hiện ra chỉ số 3 chỉ tìm đến cốt truyện đầu tiên không?
Sigur

2

Có lẽ thử một cái gì đó như Fastmap để vẽ biểu đồ của bạn bằng khoảng cách tương đối của chúng.

(vẫn) không có gì thông minh đã viết Fastmap trong python để vẽ chuỗi và có thể dễ dàng cập nhật để xử lý danh sách các thuộc tính nếu bạn viết lên số liệu khoảng cách của riêng bạn.

Dưới đây là khoảng cách euclide tiêu chuẩn tôi sử dụng, lấy hai danh sách các thuộc tính làm tham số. Nếu danh sách của bạn có giá trị lớp, đừng sử dụng nó trong tính toán khoảng cách.

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

Tôi không phải là chuyên gia về trăn, nhưng cực kỳ hữu ích khi vẽ 2 thành phần chính thứ nhất với nhau trên các trục x, y.

Không chắc chắn những gói bạn đang sử dụng, nhưng đây là một liên kết mẫu:

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


Tôi không phải là một chuyên gia thống kê. Bạn có thể vui lòng giải thích thêm về ý tưởng âm mưu?
dùng2721

Ý tưởng cơ bản là nhiều biến có tương quan với nhau và mọi thứ có thể được giảm xuống chỉ còn hai biến không tương quan với nhau và giải thích "hầu hết" biến thể của dữ liệu. Bạn cần đọc lên phân tích thành phần chính và áp dụng một gói cho phép bạn thực hiện nó. vi.wikipedia.org/wiki/Principal_component_analysis
Ralph Winters
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.