Hàng xóm gần nhất trong dữ liệu chiều cao?


163

Tôi đã hỏi một câu hỏi vài ngày trước về cách tìm hàng xóm gần nhất cho một vectơ nhất định. Véc tơ của tôi bây giờ là 21 chiều và trước khi tôi tiến xa hơn, vì tôi không thuộc lĩnh vực Machine Learning hay Math, tôi bắt đầu tự hỏi mình một số câu hỏi cơ bản:

  • Khoảng cách Euclide có phải là một thước đo tốt để tìm hàng xóm gần nhất ngay từ đầu không? Nếu không, lựa chọn của tôi là gì?
  • Ngoài ra, làm thế nào để đi đến việc quyết định đúng ngưỡng để xác định hàng xóm k? Có một số phân tích có thể được thực hiện để tìm ra giá trị này?
  • Trước đây, tôi đã được đề xuất sử dụng kd-Plants nhưng trang Wikipedia nói rõ ràng rằng đối với kích thước cao, kd-Tree gần như tương đương với tìm kiếm vũ phu. Trong trường hợp đó, cách tốt nhất để tìm hàng xóm gần nhất trong bộ dữ liệu triệu điểm hiệu quả là gì?

Ai đó có thể vui lòng làm rõ một số (hoặc tất cả) các câu hỏi trên không?


Hãy thử hỏi trên metaoptizes.com
pyjama

4
"Kích thước cao" là 20 đối với một số người và một số dữ liệu, 50 hoặc 100 hoặc 1000 đối với những người khác. Vui lòng cung cấp số nếu bạn có thể, ví dụ: "Tôi đã thực hiện mờ 21, 1000000 điểm dữ liệu, sử dụng xx".
denis

kD-Tree chia dữ liệu thành hai dọc theo một chiều. Nếu bạn có 20 thứ nguyên và chỉ có 1 điểm dữ liệu, bạn sẽ có khoảng 1 cấp cây - trong đó cấp có nghĩa là phân chia trên mọi trục. Vì không có độ sâu thực sự, bạn không nhận được lợi ích từ việc bỏ qua các nhánh của cây. Thật hữu ích khi không nghĩ về nó nhiều như một cây nhị phân, mà giống như một cây tứ giác, octtree, v.v. mặc dù nó được triển khai như một cây nhị phân.
phkahler

@denis, là 'mờ 21, 1000000 điểm dữ liệu' cho bộ dữ liệu Higgs?
nikk

1
Dưới đây là liên kết để tải xuống bộ dữ liệu Higgs. 11 triệu quan sát với 28 thuộc tính. Cột cuối cùng là nhãn: 1 cho tín hiệu, 0 cho nhiễu. archive.ics.uci.edu/ml/datasets/HIGGS
nikk

Câu trả lời:


179

Tôi hiện đang nghiên cứu các vấn đề như vậy - phân loại, tìm kiếm hàng xóm gần nhất - để lấy thông tin âm nhạc.

Bạn có thể quan tâm đến các thuật toán xấp xỉ hàng xóm gần nhất ( ANN ). Ý tưởng là bạn cho phép thuật toán trả lại đủ gần hàng xóm (có lẽ không phải là hàng xóm gần nhất); làm như vậy, bạn giảm sự phức tạp. Bạn đã đề cập đến cây kd ; đó là một ví dụ Nhưng như bạn đã nói, cây kd hoạt động kém ở kích thước cao. Trong thực tế, tất cả các kỹ thuật lập chỉ mục hiện tại (dựa trên phân vùng không gian) chuyển sang tìm kiếm tuyến tính cho các kích thước đủ cao [1] [2] [3].

Trong số các thuật toán ANN được đề xuất gần đây, có lẽ phổ biến nhất là Băm địa phương nhạy cảm ( LSH ), ánh xạ một tập hợp các điểm trong không gian nhiều chiều vào một tập hợp các thùng, tức là bảng băm [1] [3]. Nhưng không giống như băm truyền thống, hàm băm nhạy cảm cục bộ đặt các điểm gần đó vào cùng một thùng.

LSH có một số lợi thế rất lớn. Đầu tiên, nó đơn giản. Bạn chỉ cần tính toán hàm băm cho tất cả các điểm trong cơ sở dữ liệu của mình, sau đó tạo bảng băm từ chúng. Để truy vấn, chỉ cần tính toán hàm băm của điểm truy vấn, sau đó truy xuất tất cả các điểm trong cùng một thùng từ bảng băm.

Thứ hai, có một lý thuyết nghiêm ngặt hỗ trợ hiệu suất của nó. Có thể chỉ ra rằng thời gian truy vấn là tuyến tính theo kích thước của cơ sở dữ liệu, tức là nhanh hơn tìm kiếm tuyến tính. Nhanh hơn bao nhiêu tùy thuộc vào mức độ xấp xỉ chúng ta có thể chịu đựng được.

Cuối cùng, LSH tương thích với mọi định mức Lp cho 0 < p <= 2. Do đó, để trả lời câu hỏi đầu tiên của bạn, bạn có thể sử dụng LSH với thước đo khoảng cách Euclide hoặc bạn có thể sử dụng nó với thước đo khoảng cách Manhattan (L1). Ngoài ra còn có các biến thể cho khoảng cách Hamming và độ tương tự cosin.

Một tổng quan tốt đã được viết bởi Malcolm Slaney và Michael Casey cho Tạp chí Xử lý tín hiệu IEEE năm 2008 [4].

LSH đã được áp dụng dường như ở khắp mọi nơi. Bạn có thể muốn thử nó.


[1] Datar, Indyk, Immorlica, Mirrokni, "Lược đồ băm nhạy cảm cục bộ dựa trên phân phối ổn định p," 2004.

[2] Weber, Schek, Blott, "Một nghiên cứu phân tích định lượng và hiệu suất cho các phương pháp tìm kiếm tương tự trong không gian nhiều chiều," 1998.

[3] Gionis, Indyk, Motwani, "Tìm kiếm sự tương đồng trong các chiều cao thông qua băm," 1999.

[4] Slaney, Casey, "Băm nhạy cảm địa phương để tìm hàng xóm gần nhất", 2008.


1
@Steve: Cảm ơn bạn đã trả lời. Bạn có một số gợi ý về việc thực hiện LSH không? Người duy nhất tôi thấy là người từ MIT. Có gói nào khác trôi nổi xung quanh không?
Truyền thuyết

1
Ngoài cái đó ra, không, tôi không biết về người khác. Cuối cùng tôi đã tự viết bằng Python cho các mục đích cụ thể của mình. Về cơ bản, mỗi bảng băm được triển khai như một từ điển Python d, trong đó d[k]có một thùng có khóa k. d[k]chứa nhãn của tất cả các điểm có hàm băm k. Sau đó, bạn chỉ cần tính toán băm cho mỗi điểm. Xem phương trình. (1) trong [4] hoặc Mục 3 trong [1].
Steve Tjoa

@Steve: Cảm ơn sự giúp đỡ của bạn. Tôi sẽ bắt đầu thực hiện nó bây giờ. Bạn có ý tưởng nào về cách thức phương pháp này thực hiện cho các bộ dữ liệu lớn không?
Truyền thuyết

1
Một tài liệu tham khảo khác hỗ trợ LSH: So sánh các thuật toán lân cận gần nhất trong không gian chiều cao , Hendra Gunadi, 2011. cs.anu.edu.au/student/projects/11S2/Reports/Hendra%20Gunadi.pdf
Oliver Coleman

1
@SteveTjoa: Rất khó để nắm bắt trực quan các từ khóa và công thức nhúng. Như bạn đã có một điểm nổi bật duy nhất trên LSH, tôi đã bổ sung nó. Chỉ với những ý định tốt nhất. Hãy thoải mái để trở lại, mặc dù. Đó là câu trả lời của bạn sau tất cả. :)
Regexident

81

I. Thước đo khoảng cách

Đầu tiên, số lượng tính năng (cột) trong bộ dữ liệu không phải là yếu tố chọn số liệu khoảng cách để sử dụng trong kNN. Có khá nhiều nghiên cứu được công bố hướng chính xác đến câu hỏi này và các cơ sở thông thường để so sánh là:

  • phân phối thống kê cơ bản của dữ liệu của bạn;

  • mối quan hệ giữa các tính năng bao gồm dữ liệu của bạn (chúng độc lập - nghĩa là ma trận hiệp phương sai trông như thế nào); và

  • không gian tọa độ mà dữ liệu của bạn được lấy.

Nếu bạn không có kiến ​​thức trước về (các) phân phối mà dữ liệu của bạn được lấy mẫu, thì ít nhất một nghiên cứu (được ghi chép đầy đủ và kỹ lưỡng) kết luận rằng khoảng cách Euclide là lựa chọn tốt nhất.

Số liệu YEuclid được sử dụng trong Công cụ khuyến nghị web quy mô lớn cũng như trong nghiên cứu học thuật hiện tại. Khoảng cách được tính toán bởi Euclide có ý nghĩa trực quan và thang đo tính toán - nghĩa là khoảng cách Euclide được tính theo cùng một cách, cho dù hai điểm nằm trong hai chiều hay trong không gian hai mươi hai chiều.

Nó chỉ thất bại với tôi một vài lần, mỗi trường hợp khoảng cách Euclide đều thất bại vì hệ tọa độ cơ bản (cartesian) là một lựa chọn kém. Và bạn sẽ thường nhận ra điều này bởi vì độ dài đường dẫn (khoảng cách) không còn là phụ gia - ví dụ: khi không gian số liệu là bàn cờ, khoảng cách Manhattan tốt hơn Euclide, tương tự khi không gian số liệu là Trái đất và khoảng cách của bạn là trans -Các chuyến bay lục địa, một thước đo khoảng cách phù hợp cho hệ tọa độ cực là một ý tưởng hay (ví dụ: Luân Đôn đến Vienna là 2,5 giờ, Vienna đến St. Petersburg là 3 giờ nữa, ít nhiều theo cùng một hướng, nhưng từ Luân Đôn đến St . Petersburg không phải là 5,5 giờ, thay vào đó, chỉ hơn 3 giờ một chút.)

Nhưng ngoài những trường hợp dữ liệu của bạn thuộc hệ tọa độ không phải cartes, sự lựa chọn số liệu khoảng cách thường không phải là vật chất. (Xem bài đăng trên blog này từ một sinh viên CS, so sánh một số số liệu khoảng cách bằng cách kiểm tra ảnh hưởng của chúng đối với phân loại kNN - chi bình phương cho kết quả tốt nhất, nhưng sự khác biệt không lớn; Một nghiên cứu toàn diện hơn trong bài báo học thuật, Nghiên cứu so sánh về Các hàm khoảng cách cho các hàng xóm gần nhất --Mahalanobis (về cơ bản là Euclide được chuẩn hóa bằng cách tính hiệp phương sai) là tốt nhất trong nghiên cứu này.

Một điều quan trọng: để tính toán số liệu khoảng cách có ý nghĩa, bạn phải chia tỷ lệ lạidữ liệu của bạn - hiếm khi có thể xây dựng mô hình kNN để tạo dự đoán chính xác mà không cần thực hiện việc này. Ví dụ: nếu bạn đang xây dựng mô hình kNN để dự đoán hiệu suất thể thao và các biến kỳ vọng của bạn là chiều cao (cm), cân nặng (kg), bodyfat (%) và xung nghỉ (nhịp đập mỗi phút), thì điểm dữ liệu điển hình có thể trông giống như thế này: [180.4, 66.1, 11.3, 71]. Rõ ràng việc tính toán khoảng cách sẽ bị chi phối bởi chiều cao, trong khi đóng góp của bodyfat% sẽ gần như không đáng kể. Nói cách khác, nếu thay vào đó, dữ liệu được báo cáo khác đi, sao cho trọng lượng cơ thể tính bằng gam chứ không phải kilogam, thì giá trị ban đầu là 86.1, sẽ là 86.100, có ảnh hưởng lớn đến kết quả của bạn, đó chính xác là những gì bạn không không muốn

X_new = (X_old - mu) / sigma


II. Cấu trúc dữ liệu

Nếu bạn lo ngại về hiệu suất của cấu trúc cây kd, A Voronoi Tessname là một thùng chứa đơn giản về mặt khái niệm nhưng điều đó sẽ cải thiện đáng kể hiệu suất và quy mô tốt hơn so với cây kd.

dữ liệu

Đây không phải là cách phổ biến nhất để duy trì dữ liệu đào tạo kNN, mặc dù việc áp dụng VT cho mục đích này, cũng như các lợi thế về hiệu suất, được ghi lại rõ ràng (xem ví dụ báo cáo Nghiên cứu của Microsoft ). Ý nghĩa thực tế của điều này là, với điều kiện bạn đang sử dụng ngôn ngữ 'chính thống' (ví dụ: trong Chỉ số TIOBE ) thì bạn nên tìm một thư viện để thực hiện VT. Tôi biết trong Python và R, có nhiều tùy chọn cho mỗi ngôn ngữ (ví dụ: gói voronoi cho R có sẵn trên CRAN )

Sử dụng VT cho kNN hoạt động như thế này ::

Từ dữ liệu của bạn, chọn ngẫu nhiên các điểm w - đây là các trung tâm Voronoi của bạn. Một ô Voronoi đóng gói tất cả các điểm lân cận gần nhất với mỗi trung tâm. Hãy tưởng tượng nếu bạn chỉ định một màu khác nhau cho mỗi trung tâm Voronoi, sao cho mỗi điểm được gán cho một trung tâm nhất định được sơn màu đó. Miễn là bạn có mật độ đủ, thực hiện điều này sẽ hiển thị ranh giới của từng trung tâm Voronoi (như ranh giới phân tách hai màu.

Làm thế nào để chọn Trung tâm Voronoi? Tôi sử dụng hai hướng dẫn trực giao. Sau khi chọn ngẫu nhiên các điểm w, hãy tính VT cho dữ liệu đào tạo của bạn. Tiếp theo, hãy kiểm tra số lượng điểm dữ liệu được gán cho từng trung tâm Voronoi - các giá trị này phải giống nhau (mật độ điểm đồng nhất cho không gian dữ liệu của bạn). Trong hai chiều, điều này sẽ gây ra một VT có các ô có cùng kích thước. Đó là quy tắc đầu tiên, đây là quy tắc thứ hai. Chọn w bằng cách lặp - chạy thuật toán kNN của bạn với w làm tham số biến và đo hiệu suất (thời gian cần thiết để trả về dự đoán bằng cách truy vấn VT).

Vì vậy, hãy tưởng tượng bạn có một triệu điểm dữ liệu ..... Nếu các điểm được duy trì trong cấu trúc dữ liệu 2D thông thường hoặc trong cây kd, bạn sẽ thực hiện trung bình một vài triệu phép tính khoảng cách cho mỗi điểmđiểm dữ liệu mới có biến phản ứng mà bạn muốn dự đoán. Tất nhiên, những tính toán đó được thực hiện trên một tập dữ liệu. Với V / T, tìm kiếm lân cận gần nhất được thực hiện theo hai bước lần lượt, đối với hai quần thể dữ liệu khác nhau - đầu tiên là đối với các trung tâm Voronoi, sau đó khi tìm thấy trung tâm gần nhất, các điểm bên trong ô tương ứng với trung tâm đó được tìm kiếm để tìm người hàng xóm gần nhất thực tế (bằng cách tính toán khoảng cách liên tiếp) Kết hợp lại, hai lần tra cứu này nhanh hơn nhiều so với một lần tra cứu lực lượng vũ phu. Điều đó dễ thấy: đối với các điểm dữ liệu 1M, giả sử bạn chọn 250 trung tâm Voronoi để vận chuyển không gian dữ liệu của mình. Trung bình, mỗi ô Voronoi sẽ có 4.000 điểm dữ liệu. Vì vậy, thay vì thực hiện tính toán khoảng cách trung bình 500.000 (lực lượng vũ phu), bạn thực hiện ít hơn rất nhiều, trung bình chỉ 125 + 2.000.

III. Tính kết quả (biến phản ứng dự đoán)

Có hai bước để tính giá trị dự đoán từ một tập hợp dữ liệu đào tạo kNN. Đầu tiên là xác định n, hoặc số hàng xóm gần nhất sẽ sử dụng cho phép tính này. Thứ hai là làm thế nào để cân nhắc đóng góp của họ với giá trị dự đoán.

Với thành phần đầu tiên, bạn có thể xác định giá trị tốt nhất của n bằng cách giải quyết vấn đề tối ưu hóa (rất giống với tối ưu hóa bình phương tối thiểu). Đó là lý thuyết; Trong thực tế, hầu hết mọi người chỉ sử dụng n = 3. Trong mọi trường hợp, thật đơn giản để chạy thuật toán kNN của bạn qua một tập hợp các trường hợp thử nghiệm (để tính các giá trị dự đoán) cho n = 1, n = 2, n = 3, v.v. và vẽ lỗi là hàm của n. Nếu bạn chỉ muốn một giá trị hợp lý cho n để bắt đầu, một lần nữa, chỉ cần sử dụng n = 3.

Thành phần thứ hai là làm thế nào để cân nhắc sự đóng góp của mỗi người hàng xóm (giả sử n> 1).

Kỹ thuật trọng số đơn giản nhất chỉ là nhân mỗi hàng xóm với một hệ số trọng số, chỉ là 1 / (dist * K), hoặc nghịch đảo khoảng cách từ hàng xóm đó đến thể hiện kiểm tra thường được nhân với một hằng số dẫn xuất theo kinh nghiệm, K. I không phải là một fan hâm mộ của kỹ thuật này bởi vì nó thường quá sức với những người hàng xóm gần nhất (và đồng thời thiếu trọng lượng của những người ở xa hơn); tầm quan trọng của điều này là một dự đoán nhất định có thể gần như hoàn toàn phụ thuộc vào một người hàng xóm duy nhất, điều này làm tăng độ nhạy của thuật toán đối với nhiễu.

Hàm trọng số phải tốt hơn, về cơ bản tránh được giới hạn này là hàm gaussian , trong python, trông như thế này:

def weight_gauss(dist, sig=2.0) :
    return math.e**(-dist**2/(2*sig**2))

Để tính giá trị dự đoán bằng mã kNN của bạn, bạn sẽ xác định n hàng xóm gần nhất với điểm dữ liệu có biến phản hồi mà bạn muốn dự đoán ('ví dụ kiểm tra'), sau đó gọi hàm weight_gauss, một lần cho mỗi hàng xóm n, đi qua trong khoảng cách giữa mỗi hàng xóm điểm kiểm tra. Hàm này sẽ trả lại trọng số cho mỗi hàng xóm, sau đó được sử dụng làm hệ số của hàng xóm đó trong phép tính trung bình có trọng số.


2
Câu trả lời chính xác! Toàn diện và chính xác liên quan đến kinh nghiệm của tôi.
Ted Dunning

Câu trả lời hay, +1, tôi đã thêm một câu trả lời mới gần đây hơn ở đây , có tốt không?
gsamaras

1
"Vì vậy, hãy tưởng tượng bạn có một triệu điểm dữ liệu ..... Nếu các điểm đó được duy trì trong cấu trúc dữ liệu 2D thông thường hoặc trong cây kd , bạn sẽ thực hiện trung bình một vài triệu phép tính khoảng cách cho mỗi điểm dữ liệu mới có phản hồi biến bạn muốn dự đoán. " Không đồng ý. Có thể chứng minh rằng cây KD có O(sqrt(n))độ phức tạp tìm kiếm trong 2D.
Antoine

16

Những gì bạn đang phải đối mặt được gọi là lời nguyền của chiều . Đôi khi rất hữu ích khi chạy một thuật toán như PCA hoặc ICA để đảm bảo rằng bạn thực sự cần tất cả 21 thứ nguyên và có thể tìm thấy một phép biến đổi tuyến tính cho phép bạn sử dụng ít hơn 21 với chất lượng kết quả tương đương.

Cập nhật: Tôi đã gặp chúng trong một cuốn sách có tên Xử lý tín hiệu y sinh của Rangayyan (tôi hy vọng tôi nhớ chính xác). ICA không phải là một kỹ thuật tầm thường, nhưng nó được phát triển bởi các nhà nghiên cứu ở Phần Lan và tôi nghĩ mã Matlab cho nó được công khai để tải xuống. PCA là một kỹ thuật được sử dụng rộng rãi hơn và tôi tin rằng bạn sẽ có thể tìm thấy R hoặc triển khai phần mềm khác. PCA được thực hiện bằng cách giải các phương trình tuyến tính lặp đi lặp lại. Tôi đã làm nó quá lâu để nhớ làm thế nào. =)

Ý tưởng là bạn chia tín hiệu của mình thành các hàm riêng độc lập (các hàm riêng biệt, thực sự) và giá trị riêng của chúng, 21 trong trường hợp của bạn. Mỗi giá trị riêng cho thấy mức độ đóng góp mà mỗi hàm riêng cung cấp cho mỗi phép đo của bạn. Nếu một giá trị riêng nhỏ, bạn có thể biểu diễn rất chặt chẽ các tín hiệu mà không cần sử dụng chức năng riêng tương ứng của nó, và đó là cách bạn thoát khỏi một chiều.


+1 Cảm ơn bạn. Đây là một gợi ý rất thú vị và có ý nghĩa hoàn hảo. Như một yêu cầu cuối cùng, bạn có quen thuộc với bất kỳ hướng dẫn thực hành nào (bằng python hoặc R hoặc một số ngôn ngữ khác) giải thích cách thực hiện điều này một cách tương tác (ý ​​tôi là giải thích từng bước toàn bộ quá trình). Tôi đã đọc một vài tài liệu từ hôm qua nhưng hầu hết chúng dường như không thể hiểu được. Bất kỳ đề xuất?
Truyền thuyết

4
Nitpicking: ICA không phải là một thuật toán giảm kích thước. Nó không biết làm thế nào để ghi điểm các thành phần và không nên được sử dụng như vậy.
Gael Varoquaux

12

Câu trả lời hàng đầu là tốt nhưng cũ, vì vậy tôi muốn thêm một câu trả lời năm 2016 .


Như đã nói, trong một không gian chiều cao, lời nguyền của chiều không gian lẩn quẩn quanh góc, làm cho các phương pháp truyền thống, như cây kd phổ biến, chậm như một cách tiếp cận vũ phu. Do đó, chúng tôi chuyển sự quan tâm của mình sang Tìm kiếm hàng xóm gần nhất (ANNS) , theo hướng có lợi cho một số độ chính xác, đẩy nhanh quá trình. Bạn có được một xấp xỉ tốt của NN chính xác, với khả năng di chuyển tốt.


Các chủ đề nóng có thể xứng đáng:

  1. Các cách tiếp cận hiện đại của LSH , như Razenshteyn .
  2. Rừng RKD : Rừng (các) cây kd ngẫu nhiên (RKD), như được mô tả trong FLANN , hoặc trong một cách tiếp cận gần đây hơn, tôi là một phần của kd-GeRaF .
  3. LOPQ là viết tắt của Định lượng sản phẩm được tối ưu hóa cục bộ, như được mô tả ở đây . Nó rất giống với cách tiếp cận mới của Babenko + Leemitsky .

Bạn cũng có thể kiểm tra câu trả lời có liên quan của tôi:

  1. Hai bộ điểm chiều cao: Tìm hàng xóm gần nhất trong bộ khác
  2. So sánh thời gian chạy của các truy vấn Hàng xóm gần nhất trên các cấu trúc dữ liệu khác nhau
  3. PCL kd-tree thực hiện rất chậm

8

Để trả lời từng câu hỏi của bạn:

  • Không, khoảng cách euclide là một số liệu xấu trong không gian chiều cao. Về cơ bản ở kích thước cao, các điểm dữ liệu có sự khác biệt lớn giữa nhau. Điều đó làm giảm sự khác biệt tương đối về khoảng cách giữa một điểm dữ liệu nhất định và hàng xóm gần nhất và xa nhất của nó.
  • Rất nhiều bài báo / nghiên cứu có trong dữ liệu kích thước cao, nhưng hầu hết các công cụ đòi hỏi rất nhiều sự tinh vi toán học.
  • Cây KD có hại cho dữ liệu chiều cao ... hãy tránh nó bằng mọi cách

Đây là một bài báo hay để bạn bắt đầu đi đúng hướng. " Khi ở Hàng xóm gần nhất có ý nghĩa ?" bởi Beyer và tất cả.

Tôi làm việc với dữ liệu văn bản có kích thước 20K trở lên. Nếu bạn muốn một số lời khuyên liên quan đến văn bản, tôi có thể giúp bạn.


1
+1 Tôi đang in ra tờ giấy đó để đọc ngay bây giờ. Trong lúc này, bạn có gợi ý về cách khác để tìm ra hàng xóm gần nhất không? Nếu cả số liệu khoảng cách và định nghĩa của chính hàng xóm đều thiếu sót, thì mọi người thường giải quyết các vấn đề kích thước cao hơn như thế nào mà họ muốn thực hiện khớp gần đúng dựa trên các vectơ đặc trưng? Bất kỳ đề xuất?
Truyền thuyết

1
Trong trường hợp văn bản, chúng tôi sử dụng tương tự cosine rất nhiều. Tôi đang tự làm việc trong việc phân loại văn bản và thấy rằng đối với các kích thước cao, SVM với các nhân tuyến tính dường như là hiệu quả nhất.
BiGYaN

@BiGYaN Làm thế nào để bạn xác định không gian của bạn. Tôi có nghĩa là dựa trên bage của từ vector hoặc nhúng vector?
user3487667

@ user3487667, Không gian phụ thuộc vào cách bạn hình thành vấn đề của mình. Tôi đã nói về một mô hình túi từ đơn giản.
BiGYaN

5

Sự tương tự cosine là một cách phổ biến để so sánh các vectơ kích thước cao. Lưu ý rằng vì đó là điểm tương đồng không phải là khoảng cách, nên bạn muốn tối đa hóa nó chứ không thu nhỏ nó. Bạn cũng có thể sử dụng một cách cụ thể theo miền để so sánh dữ liệu, ví dụ: nếu dữ liệu của bạn là chuỗi DNA, bạn có thể sử dụng tính tương tự trình tự có tính đến xác suất đột biến, v.v.

Số lượng hàng xóm gần nhất sẽ sử dụng khác nhau tùy thuộc vào loại dữ liệu, mức độ nhiễu, v.v. Không có quy tắc chung, bạn chỉ cần tìm những gì phù hợp nhất với dữ liệu và vấn đề cụ thể của mình bằng cách thử tất cả các giá trị trong phạm vi . Mọi người có một sự hiểu biết trực quan rằng càng có nhiều dữ liệu, bạn càng cần ít hàng xóm. Trong một tình huống giả định nơi bạn có tất cả dữ liệu có thể, bạn chỉ cần tìm một người hàng xóm gần nhất để phân loại.

Phương pháp k Neighbor Neighbor được biết là đắt tiền về mặt tính toán. Đó là một trong những lý do chính khiến mọi người chuyển sang các thuật toán khác như máy vectơ hỗ trợ.


Hay đấy. Bạn có thể giải thích rõ hơn về cách tôi có thể sử dụng các SVM trong trường hợp của mình không? Tôi nghĩ rằng hàng xóm gần nhất giống như không được giám sát và các SVM được giám sát. Xin hãy sửa tôi nếu tôi sai.
Truyền thuyết

2
Cả hai phương pháp đều được giám sát, bởi vì dữ liệu đào tạo của bạn được chú thích với các lớp chính xác. Nếu bạn chỉ có các vectơ đặc trưng và không biết các lớp chúng thuộc về, thì bạn không thể sử dụng kNN hoặc SVM. Phương pháp học tập không giám sát thường được gọi là thuật toán phân cụm. Họ có thể xác định các nhóm dữ liệu tương tự, nhưng họ không cho bạn biết ý nghĩa của các nhóm.
Colin

Cảm ơn bạn đã làm rõ. Bạn đúng rồi. Nó thực sự là một kỹ thuật được giám sát. Tôi chỉ không nhận ra thứ mà tôi gọi là các loại thực sự là các lớp :)
Truyền thuyết

4

cây kd thực sự sẽ không hoạt động tốt trên dữ liệu chiều cao. Bởi vì bước cắt tỉa không còn giúp ích nhiều, vì cạnh gần nhất - độ lệch 1 chiều - hầu như sẽ luôn nhỏ hơn độ lệch toàn chiều so với hàng xóm gần nhất đã biết.

Nhưng hơn nữa, cây kd chỉ hoạt động tốt với các chỉ tiêu Lp cho tất cả những gì tôi biết, và có hiệu ứng tập trung khoảng cách làm cho các thuật toán dựa trên khoảng cách suy giảm với chiều tăng dần.

Để biết thêm thông tin, bạn có thể muốn đọc về lời nguyền của chiều, và các biến thể khác nhau của nó (có nhiều hơn một mặt của nó!)

Tôi không tin rằng có rất nhiều cách sử dụng để chỉ xấp xỉ một cách mù quáng những người hàng xóm gần nhất của Euclide, ví dụ như sử dụng LSH hoặc các phép chiếu ngẫu nhiên. Có thể cần phải sử dụng chức năng khoảng cách điều chỉnh tốt hơn nhiều ở vị trí đầu tiên!


Bạn có tài liệu tham khảo cho đoạn 1 và 2 của bạn không?
Chuck

Không, nhưng chúng nên khá rõ ràng từ các lời nhắc "thông thường về chiều" thông thường (cf, khảo sát ) và cố gắng tìm bất kỳ cây kd nào hỗ trợ bất cứ thứ gì khác ngoài Euclidean ... hỗ trợ các khoảng cách khác là có thể, nhưng không phổ biến (ELKI cho phép tất cả các khoảng cách của Minkowski + bình phương Euclide, nhưng hầu hết sẽ chỉ có Euclide). Chỉ cần xem xét rằng cây kd chỉ sử dụng một chiều để cắt tỉa và so sánh khoảng cách này với khoảng cách liên quan đến tất cả các kích thước. Ngoài ra, các phần tách của bạn sẽ không thể phân chia theo từng chiều.
Erich Schubert

3

Rất nhiều phụ thuộc vào lý do tại sao bạn muốn biết hàng xóm gần nhất. Bạn có thể xem xét thuật toán dịch chuyển trung bình http://en.wikipedia.org/wiki/Mean-shift nếu điều bạn thực sự muốn là tìm các chế độ của tập dữ liệu của bạn.


2
Theo như tôi biết thì Mean-Shift không phù hợp để phân cụm dữ liệu chiều cao. K-Means có thể là một lựa chọn tốt hơn.
fdermishin

3

Tôi nghĩ rằng cosine trên tf-idf của các tính năng boolean sẽ hoạt động tốt cho hầu hết các vấn đề. Đó là bởi vì heuristic đã được chứng minh bằng thời gian được sử dụng trong nhiều công cụ tìm kiếm như Lucene. Khoảng cách Euclide trong kinh nghiệm của tôi cho thấy kết quả xấu đối với bất kỳ dữ liệu nào giống như văn bản. Việc chọn các trọng số và ví dụ k khác nhau có thể được thực hiện với dữ liệu huấn luyện và lựa chọn tham số brute-force.


3

iDistance có lẽ là tốt nhất để truy xuất knn chính xác trong dữ liệu chiều cao. Bạn có thể xem nó như một phần ba Voronoi gần đúng.


3

Tôi đã trải qua vấn đề tương tự và có thể nói như sau.

  1. Khoảng cách Euclide là một thước đo khoảng cách tốt, tuy nhiên, nó đắt hơn về mặt tính toán so với khoảng cách Manhattan và đôi khi mang lại kết quả kém hơn một chút, do đó, tôi sẽ chọn sau.

  2. Giá trị của k có thể được tìm thấy theo kinh nghiệm. Bạn có thể thử các giá trị khác nhau và kiểm tra các đường cong ROC kết quả hoặc một số biện pháp thu hồi / độ chính xác khác để tìm giá trị chấp nhận được.

  3. Cả khoảng cách Euclide và Manhattan đều tôn trọng bất đẳng thức Tam giác , do đó bạn có thể sử dụng chúng trong các cây số liệu. Thật vậy, cây KD có hiệu suất của chúng bị suy giảm nghiêm trọng khi dữ liệu có hơn 10 thứ nguyên (bản thân tôi đã gặp vấn đề đó). Tôi thấy cây VP là một lựa chọn tốt hơn.


3

Cây KD hoạt động tốt trong 21 chiều, nếu bạn thoát sớm, sau khi nhìn vào hãy nói 5% của tất cả các điểm. FLANN thực hiện điều này (và các bộ tăng tốc khác) để khớp với các vectơ Sift 128 mờ. (Thật không may, FLANN chỉ thực hiện số liệu Euclide và scipy.spatial.cKDTree nhanh và vững chắc chỉ thực hiện các số liệu Lp; những số liệu này có thể hoặc không phù hợp với dữ liệu của bạn .) Tất nhiên có sự đánh đổi tốc độ chính xác ở đây.

(Nếu bạn có thể mô tả Ndata, Nquery, phân phối dữ liệu của mình, điều đó có thể giúp mọi người thử dữ liệu tương tự.)

Đã thêm ngày 26 tháng 4, thời gian chạy cho cKDTree với việc cắt trên ppc mac cũ của tôi, để đưa ra một ý tưởng rất sơ bộ về tính khả thi:

kdstats.py p=2 dim=21 N=1000000 nask=1000 nnear=2 cutoff=1000 eps=0 leafsize=10 clustype=uniformp
14 sec to build KDtree of 1000000 points
kdtree: 1000 queries looked at av 0.1 % of the 1000000 points, 0.31 % of 188315 boxes; better 0.0042 0.014 0.1 %
3.5 sec to query 1000 points
distances to 2 nearest: av 0.131  max 0.253

kdstats.py p=2 dim=21 N=1000000 nask=1000 nnear=2 cutoff=5000 eps=0 leafsize=10 clustype=uniformp
14 sec to build KDtree of 1000000 points
kdtree: 1000 queries looked at av 0.48 % of the 1000000 points, 1.1 % of 188315 boxes; better 0.0071 0.026 0.5 %
15 sec to query 1000 points
distances to 2 nearest: av 0.131  max 0.245

2

Bạn có thể thử đường cong az. Thật dễ dàng cho 3 chiều.


0

Khoảng cách Euclide có phải là một thước đo tốt để tìm hàng xóm gần nhất ngay từ đầu không? Nếu không, lựa chọn của tôi là gì?

Tôi sẽ đề xuất phân cụm không gian con mềm , một cách tiếp cận khá phổ biến hiện nay, trong đó trọng số tính năng được tính toán để tìm kích thước phù hợp nhất. Bạn có thể sử dụng các trọng số này khi sử dụng khoảng cách euclide chẳng hạn. Xem lời nguyền về chiều cho các vấn đề phổ biến và bài viết này cũng có thể khai sáng cho bạn bằng cách nào đó:

Một thuật toán phân cụm kiểu k-mean cho phân cụm không gian con của các bộ dữ liệu số và phân loại hỗn hợp

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.