2010-07-27 7 views
6

Sau khi nhìn xung quanh trang web này cho các vấn đề tương tự, tôi thấy điều này: http://math.nist.gov/javanumerics/jama/ và điều này: http://sujitpal.blogspot.com/2008/09/ir-math-with-java-similarity-measures.htmlCosine tương đồng của Vectors, với <O (n^2) phức tạp

Tuy nhiên, có vẻ như những chạy trong thời gian O (n^2). Tôi đã làm một số cụm tài liệu và nhận thấy mức độ phức tạp này không khả thi khi giao dịch với các bộ tài liệu nhỏ. Do, đối với sản phẩm dấu chấm, chúng tôi chỉ cần các thuật ngữ vectơ chứa trong cả hai vec-tơ thì có thể đặt các vectơ trong cây và do đó tính toán sản phẩm chấm với độ phức tạp n log n, trong đó n là số lượng từ duy nhất thấp nhất trong 1 trong 2 tài liệu.

Tôi có thiếu gì đó không? Có một thư viện java mà thực hiện điều này?

cảm ơn

+1

Bạn sẽ không có nhiều may mắn khi mọi người đọc cả hai trang đó. Có lẽ bạn có thể giải thích vấn đề của bạn rõ ràng hơn - tại sao bạn nhân các vectơ (và ý bạn là gì, O (n^2)? Việc tính toán sản phẩm chấm của hai vectơ n-chiều là tầm thường O (n), tôi rất nghi ngờ gói vectơ có thể làm hỏng nó một cách tồi tệ) –

+1

Anh ta đang tính toán sản phẩm chấm cho mọi cặp * tài liệu. Điều đó làm cho nó phức tạp bậc hai. – Rekin

+2

BlueRaja - Danny Pflughoeft, vấn đề này là nhân các vectơ rất lớn nhưng rất thưa thớt; và n không phải là thứ nguyên nhưng đếm các phần tử khác 0. –

Trả lời

2

Nếu bạn lưu trữ các phần tử vectơ trong phần bắt buộc, tra cứu chỉ là log n, không? Lặp qua tất cả các khóa trong tài liệu nhỏ hơn và xem chúng có tồn tại trong một khóa lớn hơn không ..?

+0

Bất kỳ lớp học nào bạn muốn giới thiệu? Tôi đoán con số này khá tốt, nếu bộ nhớ là một vấn đề: http://www.java2s.com/Code/Java/Collections-Data-Structure/Amemoryefficienthashmap.htm – Ash

+0

Chà không thể phán xét điều này một cách nhanh chóng, nhưng bạn có thể luôn luôn đi với một java.util.HashMap bình thường để bắt đầu với. Btw vì bạn đang nói đó là ảnh hưởng của kích thước thu thập tài liệu: Nếu bạn so sánh từng tài liệu với từng tài liệu, bạn có một thuật ngữ bậc hai khác (bây giờ là số lượng tài liệu) được bao quanh (n * log n). Đối với tôi, phần này thường có vấn đề hơn nhiều so với tính toán cosin thực tế. Đây có thể là trường hợp của bạn không? – Nicolas78

+0

Tôi cắt tỉa trên cụm sao để so sánh với một hằng số, nhưng đối với một cái gì đó như GAHC bạn hoàn toàn chính xác, bạn có một vấn đề n^2, trong đó n là số cụm được so sánh. – Ash

2

Hashmap là tốt, nhưng có thể mất rất nhiều bộ nhớ.

Nếu vectơ của bạn được lưu trữ dưới dạng cặp khóa-giá trị được sắp xếp theo khóa thì phép nhân vector có thể được thực hiện trong O (n): bạn chỉ cần lặp song song trên cả hai vectơ (cùng một lần lặp được sử dụng, ví dụ: trong thuật toán sắp xếp hợp nhất). Các giả cho phép nhân:

i = 0 
j = 0 
result = 0 
while i < length(vec1) && j < length(vec2): 
    if vec1[i].key == vec2[j].key: 
    result = result + vec1[i].value * vec2[j].value 
    else if vec1[i].key < vec2[j].key: 
    i = i + 1 
    else 
    j = j + 1 
+0

Tôi thích ý tưởng này, cảm ơn. Có một thư viện java sử dụng nguyên tắc này? – Ash

+0

Tôi không biết; nhưng lucene (http://lucene.apache.org/java/docs/index.html) có thể chứa thuật toán như vậy. –

+0

Cảm ơn dmitry-vk, có vẻ như một bản đồ được sắp xếp có thể là tốt nhất: http://java.sun.com/j2se/1.4.2/docs/api/java/util/SortedMap.html – Ash

0

Nếu bạn chỉ muốn giới thiệu các mặt hàng có hạn, cho các hạng mục ví dụ mét, để tất cả các mục trong một bộ với kích thước của n, sự phức tạp không cần phải là n^2, nhưng m * n. Vì m là hằng số, độ phức tạp là tuyến tính.

Bạn có thể kiểm tra với dự án simbase https://github.com/guokr/simbase, đây là cơ sở dữ liệu vectơ tương tự vectơ.

Simbase sử dụng dưới đây khái niệm:

  • Vector thiết lập: một tập hợp các vectơ
  • Cơ sở: cơ sở cho vectơ, vectơ trong một bộ vector có cùng sở
  • Khuyến nghị: một hướng nhị phân mối quan hệ giữa hai tập hợp vector có cùng một cơ sở
0

Nếu bạn định sử dụng tính tương tự cosin như một cách tìm các cụm tài liệu tương tự, bạn có thể muốn sider nhìn vào locality-sensitive hashing, một phương pháp dựa trên băm được thiết kế đặc biệt với điều này trong tâm trí. Trực quan, LSH băm các vectơ theo cách có xác suất cao đặt các phần tử tương tự vào cùng một nhóm và các phần tử ở xa thành các nhóm khác nhau. Có các lược đồ LSH sử dụng tính tương tự cosin như khoảng cách cơ bản của chúng, vì vậy để tìm các cụm bạn sử dụng LSH để đưa mọi thứ vào các nhóm và sau đó chỉ tính toán khoảng cách hai chiều của các phần tử trong cùng một nhóm. Trong trường hợp xấu nhất này sẽ là bậc hai (nếu mọi thứ rơi vào cùng một nhóm), nhưng có nhiều khả năng bạn sẽ có một sự sụt giảm đáng kể trong công việc.

Hy vọng điều này sẽ hữu ích!