2013-01-22 38 views
5

Tôi cần phát triển một thuật toán có thể định vị vị trí mục dữ liệu trong một số cấu trúc phân cấp. Tôi có phân cấp phân loại các yếu tố của một số tập dữ liệu. Phân cấp là phân loại - phần tử trên cùng là lớp chung nhất, khớp với bất kỳ phần tử nào của tập dữ liệu, các phần tử sâu hơn chứa các lớp cụ thể hơn phù hợp với một số tập hợp con của tập dữ liệu.Cách xác định vị trí mục dữ liệu trong cấu trúc phân cấp?

Ví dụ: xem xét phân cấp của du thuyền. Chúng tôi có lớp Du thuyền ở trên cùng. Ở cấp độ tiếp theo, chúng tôi có Du thuyền buồmDu thuyền có động cơ. Thuyền buồm du thuyền có hai con - Du thuyền cruisingĐua du thuyền. Các tàu tuần dương có thể được nhà sản xuất phân chia thêm, ví dụ: Du thuyền BavariaDufour Yachts. Sau đó, mỗi lớp học này có thể được chia nhỏ hơn bằng loại thân tàu, chiều dài, cánh buồm và vân vân.

Đây là một ví dụ từ các tập dữ liệu:

Drive Class Manufacturer Hull type Len Sails Area ... Model 
Sailing Cruiser Bavaria Yachts Mono-hull 25ft 560sqft ... Bavaria 32 
Sailing Cruiser Dufour Yachts Mono-hull 27ft 580sqft ... Dufour 32 Classic 

tôi có thể dễ dàng lập bản đồ mỗi mẫu để phân cấp bằng cách tìm kiếm nó theo thứ tự độ sâu-đầu tiên.

Đây là một vấn đề tìm kiếm đơn giản ngay từ cái nhìn đầu tiên nhưng có một số khó khăn.

Khó khăn đầu tiên: các mục dữ liệu không cần thiết chứa tất cả các phần tử. Thông thường, mục dữ liệu thiếu từ 10 đến 50 phần trăm phần tử. Nhiều yếu tố này không có ý nghĩa quan trọng, ví dụ: du thuyền Drive chỉ có thể là Motor hoặc Sail để nó không mang lại nhiều thông tin (chỉ 1 bit). Những yếu tố này có thể được suy ra dễ dàng bằng cách sử dụng các yếu tố quan trọng hơn, ví dụ nếu chúng ta biết du thuyền Mô hình, chúng ta có thể phỏng đoán tất cả các phần tử khác (hoặc trường) của dữ liệu mục.

Khó khăn thứ hai: một số yếu tố có thể khác nhau giữa các mục dữ liệu khác nhau ngay cả khi chúng tương ứng với cùng một vị trí trong cấu trúc phân cấp (cùng mô hình du thuyền). Ví dụ: Khu vực cánh buồm có thể khác nhau rất nhiều vì chủ tàu sửa đổi giàn khoan của du thuyền theo một cách khác hoặc chỉ giá trị diện tích tròn.

Như tôi đã đề cập, tôi cần xác định các mục dữ liệu khác nhau từ tập dữ liệu trong cấu trúc phân cấp. Mỗi mục dữ liệu có thể được đặt với độ chính xác khác nhau. Độ chính xác là độ sâu trong cấu trúc phân cấp mà quá trình tìm kiếm dừng lại. Nói cách khác, tôi cần phải có được đường dẫn trong hệ thống phân cấp tương ứng với từng mục dữ liệu và đường dẫn này có thể không đầy đủ. Ví dụ: thuật toán có thể thấy rằng các mục dữ liệu tương ứng với Juliet 23 du thuyền nhưng năm sản xuất vẫn chưa được biết.

Sẽ thật tuyệt nếu tôi có thể nhận được nhiều đường dẫn với thước đo xác suất cho từng đường dẫn. Ví dụ: thuật toán có thể trả lại 4 đường dẫn cho Juliet 23 cho các năm sản xuất khác nhau, mỗi năm có xác suất 25%.

Tại thời điểm này, tôi giải quyết vấn đề này bằng cách sử dụng tìm kiếm độ sâu đầu tiên với một số chẩn đoán. Nó cho kết quả tốt nhưng tôi nghĩ rằng có thể có được kết quả tốt hơn. Có lẽ bạn có thể xây dựng vấn đề này theo cách chung chung hơn để tôi có thể tìm kiếm một số tài liệu học thuật về nó.

Trả lời

1

Tôi nghĩ SQL thực sự có thể giúp bạn giải quyết những khó khăn của bạn,

Đối với khó khăn đầu tiên của bạn: sử dụng NVL (lĩnh vực, giá trị nếu null)

Ví dụ: loại In & sản xuất năm (nếu nó tồn tại), những chiếc du thuyền đua

SELECT Y.TYPE, NVL(Y.PRDYEAR, 'UNKNOWN') 
FROM T_YACHT Y WHERE Y.CLASS = 'RACING' 

Ví dụ: có được tất cả Du thuyền mà Năm sản xuất là so với năm 2000

SELECT * FROM T_YACHT Y WHERE 
NVL(Y.PRDYEAR,TO_TIMESTAMP('01-01-0001','DD-MM-YYYY')) 
    > TO_TIMESTAMP('01-01-2000','DD-MM-YYYY') 

Đối với khó khăn Thứ hai của bạn: sử dụng GROUP BY \ Cascading-SQL \ DISTINCT \ NVL

dụ: xem có bao nhiêu loại du thuyền đua xe là có

SELECT Y.TYPE, COUNT(Y.ID) AS YACHT_TYPE 
FROM T_YACHT Y 
WHERE Y.CLASS = 'RACING' 
GROUP BY Y.TYPE 
Các vấn đề liên quan