Thuật toán Birch không co cụm như mong đợi


10

Tôi đang sử dụng thuật toán Birch từ gói Python tìm hiểu scipy để phân cụm một tập hợp các điểm trong một thành phố nhỏ theo nhóm 10.

Tôi sử dụng mã sau đây:

no = len(list_of_points)/10
brc = Birch(branching_factor=50, n_clusters=no, threshold=0.05,compute_labels=True)

Trong ý tưởng của tôi, tôi sẽ luôn luôn kết thúc với bộ 10 điểm. Trong trường hợp của tôi bây giờ, tôi có 650 điểm để phân cụm và n_cl cluster là 65.

Nhưng, vấn đề của tôi là với ngưỡng quá thấp, tôi kết thúc với 1 địa chỉ một cụm, chỉ là một ngưỡng lớn hơn nhỏ - 40 địa chỉ trên mỗi cụm.

Tôi làm gì sai ở đây?


Có lẽ đó là CRS. Vấn đề? Nếu bạn đã thử với độ (như WGS 84), hãy thử số liệu. Có một sự khác biệt khá lớn về tọa độ và cả hai có thể yêu cầu giá trị ngưỡng khác nhau. Ngoài ra, bạn có thể thử với thư viện python khác nhau, tôi thực sự khuyên bạn nên sử dụng scikit-learn.
dmh126

..erm, tôi đang phân cụm trên cơ sở tọa độ GPS khi nhận được từ Google API, tôi cho rằng chúng được định dạng chuẩn. Không?
kaboom

Có thể dán vào đây những tọa độ này, tôi sẽ cố gắng tìm ra điều này.
dmh126

dmh126 có thể đúng: API Goolge đang hoạt động với WGS84, đây là Hệ thống trắc địa (Thế giới), không phải là số liệu
André

Câu trả lời:


10

Tôi đã thực hiện một số nghiên cứu. Tôi đã lấy một số điểm trong hai hệ tọa độ phi số liệu (WGS84) và số liệu (Ba Lan 1992).

Tôi đã sử dụng mã này:

from scipy import loadtxt
from sklearn.cluster import Birch
import matplotlib.pyplot as plt

data84 = loadtxt("/home/damian/workspace/84.csv", delimiter=",")
data90 = loadtxt("/home/damian/workspace/90.csv", delimiter=",")

brc = Birch(threshold=0.5)

Sau đó, tôi phù hợp với mô hình của chúng tôi với dữ liệu số liệu:

brc.fit(data90)

Và vẽ kết quả, trong đó các đường chéo là điểm và vòng tròn của tôi là các phân nhóm của tôi:

c = brc.subcluster_centers_
plt.plot(data90[:,0], data90[:,1], '+')
plt.plot(c[:,0], c[:,1], 'o')
plt.show()

Đây là những gì tôi nhận được: nhập mô tả hình ảnh ở đây

Bạn có thể thấy, giá trị ngưỡng đó quá nhỏ, bởi vì nó tìm thấy phần tử con trong mỗi điểm.

Định nghĩa ngưỡng:

Bán kính của phần tử con thu được bằng cách hợp nhất một mẫu mới và phần tử con gần nhất phải nhỏ hơn ngưỡng. Nếu không, một subcluster mới được bắt đầu.

Vì vậy, trong trường hợp này chúng ta cần tăng giá trị này.

Dành cho:

brc = Birch(threshold=5000)

nó đã tốt hơn nhiều

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

Và điểm WGS84 cho ngưỡng 0,5:

brc = Birch(threshold=0.5)
brc.fit(data84)

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

Chỉ có một subcluster, không tốt. Nhưng trong trường hợp này, chúng ta nên giảm giá trị ngưỡng, vì vậy 0,05:

brc = Birch(threshold=0.05)
brc.fit(data84)

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

Chúng tôi đã có kết quả tốt đẹp.

Phần kết luận:

Vấn đề CRS. Bạn cần tìm một giá trị ngưỡng thích hợp, tùy thuộc vào hệ thống tọa độ dữ liệu của bạn và khoảng cách giữa các điểm. Nếu bạn có CRS không số liệu, ngưỡng sẽ tương đối nhỏ hơn so với hệ thống số liệu. Bạn phải biết sự khác biệt giữa mét và độ, nếu khoảng cách giữa hai điểm bằng 10000m, nó sẽ nhỏ hơn 1 độ trong WGS84. Kiểm tra google để giá trị chính xác hơn.

Ngoài ra có nhiều điểm hơn giá trị n_cl cluster. Không sao, không có các cụm sao, mà là các cụm. Nếu bạn cố gắng dự đoán một cái gì đó hoặc in nhãn, nó sẽ phân loại điểm của bạn đến một trong các khu vực n_cl cluster (hoặc các điểm in được phân loại thành 0,1,2, ..., nhãn n_cl cluster).

Nếu bạn không muốn thử các tham số khác nhau, bạn luôn có thể sử dụng thuật toán khác. Thuật toán rất đơn giản và phổ biến để phân cụm là thuật toán K-mean.

http://scikit-learn.org/urdy/modules/generated/sklearn.cluster.KMeans.html

Nó sẽ tìm n cụm cho dữ liệu của bạn mà không cần quan tâm đến ngưỡng, v.v.

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.