Bạn có thể giải quyết vấn đề này theo nhiều cách khác nhau. Một trong những điều hiển nhiên khi bạn ném từ khóa "clustering" là sử dụng kmeans (xem các trả lời khác).
Tuy nhiên, trước tiên bạn có thể muốn hiểu rõ hơn về những gì bạn đang thực sự làm hoặc đang cố gắng làm. Thay vì chỉ ném một hàm ngẫu nhiên vào dữ liệu của bạn.
Theo như tôi có thể kể từ câu hỏi của bạn, bạn có một số giá trị 1 chiều và bạn muốn tách chúng thành số không rõ, phải không? Vâng, k-có nghĩa là có thể làm các thủ thuật, nhưng trên thực tế, bạn chỉ có thể tìm kiếm sự khác biệt lớn nhất trong tập dữ liệu của bạn sau đó là k. I.e. đối với bất kỳ chỉ mục nào i > 0
, hãy tính k[i] - k[i-1]
và chọn các chỉ mục k
nơi số này lớn hơn số còn lại. Rất có thể, kết quả của bạn thực sự sẽ là tốt hơn và nhanh hơn sử dụng k-means.
Trong mã python:
k = 2
a = [1, 2, 3, 60, 70, 80, 100, 220, 230, 250]
a.sort()
b=[] # A *heap* would be faster
for i in range(1, len(a)):
b.append((a[i]-a[i-1], i))
b.sort()
# b now is [... (20, 6), (20, 9), (57, 3), (120, 7)]
# and the last ones are the best split points.
b = map(lambda p: p[1], b[-k:])
b.sort()
# b now is: [3, 7]
b.insert(0, 0)
b.append(len(a) + 1)
for i in range(1, len(b)):
print a[b[i-1]:b[i]],
# Prints [1, 2, 3] [60, 70, 80, 100] [220, 230, 250]
(Đây btw có thể được coi là một đơn giản đơn liên kết clustering.!)
Một phương pháp tiên tiến hơn, mà thực sự được thoát khỏi những tham số k
, tính độ lệch trung bình và chuẩn của b[*][1]
và chia tách cho dù giá trị lớn hơn số mean+2*stddev
. Tuy nhiên đây là một heuristic khá thô. Một tùy chọn khác sẽ thực sự giả định phân phối giá trị chẳng hạn như k
phân phối bình thường và sau đó sử dụng ví dụ: Levenberg-Marquardt để phù hợp với các bản phân phối cho dữ liệu của bạn.
Nhưng đó thực sự là điều bạn muốn làm?
Trước tiên, hãy xác định nội dung phải là cụm và số không. Phần thứ hai quan trọng hơn nhiều.
Đây không phải là vấn đề cụ thể về Python. Trước tiên, bạn phải chọn một thuật toán phân cụm thích hợp và xem cách bạn có thể triển khai bằng Python (hoặc nếu nó đã được triển khai thực hiện, ví dụ trong SciPy). –
Nếu vấn đề và tập dữ liệu luôn luôn như thế này, bạn có thể sử dụng một "nhà làm" heuristic mình, và tinh chỉnh nó để làm việc trên dữ liệu của bạn. Nhưng nếu sự phức tạp sẽ nhiều hơn một chút, tôi nghĩ bạn không thể tha thứ cho việc nghiên cứu nhiều đề xuất và thuật toán tốt được chỉ ra trong câu trả lời. – heltonbiker
Nó không phải lúc nào cũng giống như thế này. Sự khác biệt là: 1. thêm số. 2. khoảng cách khác nhau giữa các cụm. 3. Những khoảng trống khác nhau giữa các phần tử trong các cụm. Điều còn lại là sự khác biệt giữa khoảng cách giữa các phần tử và khoảng trống cụm là quan trọng hoặc nói cách khác: Delta (các phần tử) << Delta (cluster) – Zurechtweiser