TÌM HIỂU THUẬT TOÁN KNEAREST NEIGHBORS (KNN) TRONG BỘ NHỚ THEO KHÔNG GIAN

27 4.5K 23
TÌM HIỂU THUẬT TOÁN KNEAREST NEIGHBORS (KNN) TRONG BỘ NHỚ THEO KHÔNG GIAN

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

      ! "#$$%$%&"#' ()$" *+,-.*/,%0%0123 45.*/, 627,8,- 9:; <==<==> ?@A 8BC45D"CE8F CG,-=<,7HI=<J  TÌM HIỂU THUẬT TOÁN K-NEAREST NEIGHBORS (K-NN) TRONG BỘ NHỚ THEO KHÔNG GIAN GIỚI THIỆU   Hiện nay công nghệ thông tin là ngành không thể thiếu cho tất cả những ngành nghề khác tồn tại trên thế giới hiện đại. Tuy nhiên nếu không có có các khoa học cơ bản nhất là toán học thì tin học không thể ra đời. Toán học đóng vai trò hầu như trong mọi phạm vi của tin học từ lúc sản xuất ra phần cứng, biểu diễn thông tin, tính toán …cho đến giao diện giao tiếp với người sử dụng. Và cho đến ngày nay và cả trong tương lai, vai trò về mặt ứng dụng của toán học cho tin học ngày càng cao đến một mức độ thông minh tuyệt đỉnh. Chúng ta sẽ đi sơ qua một khía cạnh nhỏ của toán học trong phạm vi ứng dụng để tạo ra các phần mềm, sự tích hợp và dịch vụ trong tin học. Thuật toán là thành phần cơ bản không thể thiếu của chúng nhất là đối với các hệ thống thông minh hơn đơn thuần là giao tiếp và lưu trữ dữ liệu. Trong bài thu hoạch này chúng ta sẽ “TÌM HIỂU THUẬT TOÁN K-NEAREST NEIGHBORS (K-NN) TRONG BỘ NHỚ THEO KHÔNG GIAN”. k-NN là một trong những thuật toán rất đơn giản để hiểu, nhưng làm việc rất tốt trong thực tế, nó nằm trong nhóm các thuật toán về NNS (tìm các lân cận gần nhất) là thuật toán có ứng dụng rất đa dạng và linh hoạt. Nếu đi sâu vào các lĩnh vực như xử lý ảnh, nhận dạng và phân tích dữ liệu, chúng là một thuật toán mà thiếu nó thì mọi thứ sẽ trở nên cực kì khó khăn. Hầu hết mọi người chỉ tìm hiểu các thuật toán chứ không sử dụng nó nhiều, đó là một điều rất đáng tiếc. k-NN là một trong 10 những thuật toán khai thác dữ liệu (data mining) hàng đầu và là thuật toán thuật toán đơn giản nhất trong các thuật toán về máy học (machine learning). Em rất chân thành cám ơn thầy Đỗ Văn Nhơn, dạy môn học này đã cho em biết thêm các kiến thức về khái niệm, ý nghĩa, các tài liệu và ứng dụng của toán trong tin học và cụ thể là giúp em có kiến thức để thực hiện bài viết này. Trong phạm vi môn học phương pháp toán trong tin học, em chỉ trình bày bài viết có tính chất tìm hiểu thuật toán k-NN trong phạm vi sử dụng bộ nhớ (memory algorithms ) và các giải thuật tập trung vào cấu trúc không gian (Spatial Structure) chứ không trình bày tất cả các phương pháp của chúng. TP. HCM, Ngày 04 tháng 01 năm 2015 Đỗ Văn Cang  Mục Lục   ! "#$%&' (##)  #&* +,-. /0-12 Nội Dung  I. Định nghĩa Theo từ định nghĩa tiếng anh thì k-NN có nghĩa là “k-nearest neighbors” và thuật toán đó là “the k-nearest neighbors algorithm (k-NN)” Bài toán này là bài toán tìm người láng giềng gần nhất , ví dụ bạn đang ngồi học bài trong một lớp học, hãy tìm người gần bạn nhất ? hoặc tìm người có mái tóc giống mái tóc của bạn nhất ? Xét tập N điểm trong không gian 2 chiều, cho một điểm q trong không gian đó, hãy tìm điểm p trong tập N điểm gần với q nhất (euclide). Một cách tổng quát cho một tập S chứa n các đối tượng có d thuộc tính trong không gian . Cho một đối tượng q trong không gian đó, hãy tìm k đối tượng gần với q nhất. Thông tin cơ bản nhất để thực hiện việc tìm kiếm này là khoảng cách (xét khoảng cách euclide), để tìm được điểm gần nhất tức là ta phải tìm được điểm p sao cho (1) Trong đó khoảng cách euclide từ p bất kì đến q sẽ là (2) Mở rộng k đối tượng cần tìm , ta sẽ lần lượt tìm các đối tượng thõa mãn điều kiện (1) nhưng phải có khoảng cách lớn hơn đối tượng tìm được trước trước đó. . q p Hình 1. Lân cận gần nhất của q là p II. Thuật toán k-NN Vét cạn 2.1. Ý tưởng Duyệt qua tất cả các điểm trong tập S, tìm khoảng cách đến đối tượng đang xét q và nếu khoảng cách này nhỏ hơn khoảng cách lớn nhất trong tập K thì chèn nó vào tập K theo đúng thứ tự tăng dần theo khoảng cách. Sau khi chạy hết n đối tượng trong S thì K là tập kết quả chỉ chứa k đối tượng. 2.2. Thuật toán //S : tập điểm vào //q : điểm cần tìm //k : số điểm gần nhất //K : tập hợp có thứ tự theo dis Find_kNN_Linear ( Input : S(n) , q,k; Output : K(k) ) { B1/ K = {} B2/ for( pi S) { if ( dis(pi,q) <= Max(K) ) { InsertOrder(K, dis(pi,q),pi); } } } //K : tập cần insert chứa dis và p, dis : khoảng cách, p : điểm insert – có thể sử dụng thuật thoán QuickSearch để chèn ngay vào vị trí cần chèn. InsertOrder(K(k), dis, p) { for i = k-1 downto 0 step -1 { if K[i] <= dis then { K[i+1] (dis,p)//insert to position i+1 return; } } K[0] (dis,p) 2 } 2.3. Phân tích độ phức tạp và nhận xét - Find_kNN_Linear có độ phưc tạp O(n) do vòng lặp n lần, hàm Max(K) lấy đối tượng cuối nên không tính. - InsertOrder : có độ phức tạp O(k) = c hằng số Độ phức tạp của thuật toán tìm k-NN = c*O(n)= O(n) Nếu tìm cho n điểm bên trong tập S thì độ phức tạp sẽ là O( ) Thuật toán linear này chỉ để nhìn thấy tính chất rõ rang nhất của cách tìm k-NN, và chỉ ứng dụng cho tập số lượng đối tượng tương đối nhỏ. III. Thuật toán k-NN cải tiến sau vét cạn 3.1. Ý tưởng Bắt đầu nghĩ đến không gian (spatial partitioning strategy) ?!? phải có một cách nào đó để việc tìm kiến chỉ dựa vào một vùng không gian nhỏ hơn tập S và gần với q. Cách đơn giản nhất là chúng ta sẽ chia lưới chúng , mỗi một ô gọi là điểm rời rạc. Vì khi theo các điểm rời thì ta biết chắc chắn những điểm gần nó phải là 8 ô gần nhất của nó theo 8 hướng trong không gian rời rạc. Nếu xét trên không gian rời rạc (Raster hóa), ta có thể dựa vào phương pháp quét theo vòng tròn quanh điểm cần tìm để mở rộng ra cho đến khi tìm được. Như thế đảm bảo cho việc các đối tượng đầu tiên tìm được luôn thõa điều kiện. Và sẽ không phải duyệt qua các điểm không cần thiết. Ở đây không trình bày thuật toán phần này vì nó liên quan đến raster và một số việc xét duyệt các điểm lân cận theo vòng tròn. 3.2. Phân tích độ phức tạp và nhận xét Nếu kết quả tìm được là khoảng cách k-NN trung bình (theo đơn vị raster) của tất cả các điểm trong tập S là e. thì lúc đó ta sẽ có độ phức tạp thuật toán sẽ xấp xỉ e*O(n) - Nếu ta raster tập S càng nhỏ thì lúc đó e ~ n và độ phức tạp là O( ) - Nếu raster tập S lớn lúc đó một đơn vị raster gần như ~ n thì việc tìm k-NN sẽ tương đương với linear O( ), vì chỉ có 1 ô raster. 3 - Như vậy thuật toán này sử dụng raster vừa phải sẽ cho kết quả tương đối theo O(n). Nhưng nếu S phân số theo kiểu chứa n1 đối tượng rời rạc và n2 đối tượng tập trung dày đặt và đường đi từ n1 đến n2  n thì độ phức tạp ~ O( ) nên thuật toán này cũng không khả thi cho mọi trường hợp. IV. Thuật toán k-NN kd-Tree 4.1. Ý tưởng Theo cách raster ở trên, với phân vùng là các ô vuông và từ ô hiện hành (chứa q) mở rộng ra 8 hướng theo xoắn ốc cho đến khi tìm ra đối tượng gần nhất. Tuy nhiên cách tìm mở rộng theo 8 hướng sẽ dẫn tới trường hợp duyệt hết toàn bộ các đối tượng nếu khoảng cách giữa 2 ô chứa rất nhiều ô rỗng dẫn tới duyệt gần như hết toàn bộ data. Thêm vào đó việc phân vùng càng nhỏ thì việc tìm càng nhanh, tuy nhiên các ô trống sẽ phát sinh rất nhiều và làm cho tốc độ tìm đến ô có đối tượng rất chậm trong không gian ma trận raster cực kì lớn. Từ đó ngoài việc phân vùng, nhất thiết cần phải có cách để nhận biết trong các vùng sau khi phân hoạch thì vùng nào gần q nhất và phân vùng đó càng nhỏ càng tốt. Nếu có được 2 điều này và một phân vùng chỉ chứa 1 đối tượng thì đó là cách hoàn hảo nhất nếu không gian lưu trữ không quá nhiều. Vấn đề là điều đó gần như rất khó thực hiện, tuy nhiên nếu không tìm được vùng nào gần nhất thì hãy thử tìm vùng nào gần nhất theo 1 thuộc tính (dimension) nào đó. Bởi vì 2 đối tượng có gần nhau thì thường chúng cũng gần theo các thuộc tính khác. Điều này thì có thể thực hiên được. Nhưng cần phải có một cách phân vùng khác. 4.2. Phân tích thuật toán QuadTree Ý tưởng nhờ vào cấu trúc cây đã phần nào giải quyết các vấn đề trên, điển hình là thuật toán QuadTree. Thuật toán này chia vùng không gian hiện tại thành 4 thành phần con gọi là Node, và tiếp tục như thế cho các Nodes con cho đến khi nào mỗi Node chỉ chứa giới hạn tối thiểu các đối tượng gọi là Leaf Node. 4 Việc tìm kiếm trên tree này dựa vào sự giao nhau của vùng đang xét và một bán kính R tối đa nhờ vào thông tin từ bên ngoài hoặc trước đó để giới hạn không gian tìm kiếm, nếu đi qua được Leaf Node thì cập nhật lại R theo khoảng cách ngắn nhất. Quá trình này tiếp tục cho đến khi quá trình kết thúc do không gian tìm kiếm bị co lại tối thiểu. Như vậy QuadTree cũng đã giải quyết được phần nào về vấn đề phân vùng tìm kiếm, tuy nhiên với dữ liệu rời rạc trong không gian rộng lớn, việc build tree này làm chứa nodes con và tiêu tốn rất nhiều không gian trống, và tất nhiên tìm kiếm trên số lượng nodes như thế là không tốt lắm. 5 6#789:;<=>"=>?@?; 6ABCD-; Có một cải thiện của QuadTree là trong quá trình build tree, node nào không chứa đối tượng nào thì xem như không có node đó. Nhưng dù sao nó cũng không phải là thuật toán làm hài lòng nhất. 4.3. Phân tích thuật toán kd-Tree Sự xuất hiện của kd-Tree đã làm cho mọi thứ trở nên cực kì tốt đẹp, các phân vùng nhỏ tùy ý và việc giới hạn phân vùng tìm kiếm dựa trên một số nền tảng cơ bản về kd- Tree. KL#MNNOP-QR kd-Tree (k- dimension tree) thực chất là một BTree (Binary tree - cây nhị phân), sự khác biệt duy nhất và đơn giản nhất của kd-Tree với BTree là : + Btree phân cấp theo một thuộc tính duy nhất cho mọi Nodes(*) trong tree. + kd-Tree phân cấp theo nhiều thuộc tính, mỗi node trung gian sẽ chọn một thuộc tính để phân cấp. Thuộc tính đó chính mà số chiều (dimension) của đối tượng. STUMV5KL#MNN Có 2 loại node trong kd-Tree: + SplitNode: node trung gian chứa các thông tin cơ bản sau  Thuộc tính cắt lát ( dimension)  Giá trị cắt lát (Split Value)  Thông tin phân vùng không gian chứa các đối tượng bên trong. + Leaf Node: node lá chứa thông tin của các đối tượng. T*OLKL#MNN Bắt đầu từ node root ban đầu là vùng chứa vùng không gian bao đóng(*) của tất cả các đối tượng trong S. Root node là SplitNode. Quá trình hình thành các nodes con từ một node hiện hành từ việc chọn ra tiêu chuẩn cắt lát (Split ) dựa trên một thuộc tính nào đó (cần tìm) và tính chất thứ tự từ trái sang phải từ trên xuống của bTree. Phương pháp cắt lát tại mỗi node + Chọn thuộc tính cắt lát. E + Cắt lát theo giá trị Median(*) của thuộc tính đã chọn. Khảo sát ví dụ gồm các đối tượng A,B,C,D,E như (hình 4.1), là các đối tượng trong không gian 2 chiều ( 2 thuộc tính) là Ox, Oy. Nguyên tắc: Cắt theo median của Ox,Oy,Ox,Oy… tổng quát: level mod 2 với level là cấp của node. Đối tượng tại lát cắt phải thuột node con bên phải, cắt cho tới khi nào Node chỉ chứa số đối tượng <= bucketsize(*), bucketsize ở đây = 1 là số đối tượng tối đa trong LeafNode(node lá), các Node trung gian gọi là SplitNode. - Trước tiên từ node root N0, chọn Ox làm chiều cắt lát, cắt theo median thành 2 nodes con N1, N2 (hình 4.2). - Tiếp tục cắt theo Oy 2 Node con còn lại F [...]... nhằm mục đích tìm hiểu về thuật toán tìm các đối tượng lân cận gần nhất (k-NN) trong bộ nhớ sử dụng kd-Tree Từ việc tìm hiểu cài đặt thuật toán có thể kết luận: thuật toán dựa trên kd-Tree là thuật toán có thể nói là tốt nhất trong các thuật 25 toán đơn giản, sáng sủa, dễ hiễu và dễ cài đặt Tuy nhiên thuật toán này chỉ ứng dụng cho các tập đối tượng có số thuộc tính không quá lớn Do thời gian hạn hẹp... đặt cơ bản thuật toán + Thuật toán được cài đặt trên ngôn ngữ C# nền NET 3.5 (có thể chuyển sang 1.1 dễ dàng) + Thuật toán cài đặt mức độ tổng quát cho không gian d chiều, do đó tốc độ sẽ không được tốt nhất bởi vì phải sử dụng vòng lặp cho d chiều Nếu áp dụng vào không gian cụ thể thì nên bỏ vòng lặp để tối ưu tốc độ + Thuật toán sử dụng index hóa các array nhằm mục đích tiết kiệm không gian nhớ và tăng... lại ở mức tìm hiểu và cài đặt thuật toán ở mức có thể ứng dụng thực tế cho các ứng dụng cần sử dụng k-NN Vấn đề cần nghiên cứu sâu hơn là tìm và phân tích độ phứt tạp của thuật toán k-NN sử dụng kd-Tree ( Median , Sliding MidPoint ) cho mọi trường hợp một cách rõ ràng nhất bằng công thức toán học Đồng thời, dựa vào thuật toán k-NN để có thể thực hiện một số ứng dụng liên quan như thuật toán tìm nhóm... theo không gian Vì bản chất các thuột toán kd-Tree là phân vùng theo không gian Phép cắt này không cắt theo median mà nó sẽ cắt theo điểm chính giữa của phân vùng không gian dựa trên thuộc tính cắt tại node đang xét Hay còn gọi là MidPoint Split Cụ thể nếu vùng bao của nó là một hình chữ nhật trong không gian 2d và tại node đó thuộc tính theo 0x là thuộc tính cắt thì giá trị cắt chính là tâm điểm của... nhớ và tăng tốc độ + Thuật toán cài đặt tách riêng phần build tree và search, do đó nếu có nhu cầu build cây theo 1 cách khác thì có thể tái sử dụng toàn bộ source code với thay đổi tối thiểu code + Thuật toán thực hiện dựa trên sự so sánh về logic tốc độ với thuật toán ANN chuẩn C+ + trên trang web http://www.cs.umd.edu/~mount/ANN/ + Thuật toán có áp dụng xử lý parallel (song song) theo số lượng CPU... có thể kết luận: trong mọi trường hợp thì phương pháp Spliding MidPoint vẫn là lựa chọn tốt nhất 20 V Cài đặt Source code được đặt tại địa chỉ http://code.google.com/p/cdomaster/downloads/detail?name=kNNSolution.zip 5.1 Tính đúng đắn của các thuật toán Tất cả các thuật toán tìm k-NN dựa trên kd-Tree chỉ đơn thuần là phân vùng các đối tượng là tìm trên phân vùng gần hơn theo không gian Giả sử tập S... giá trị này cũng chính là độ dài bao đóng của các đối tượng bên trong theo thuộc tính đó do tính chất median + Cắt lát theo giá trị Median(*) của thuộc tính đã chọn : phần từ đứng giữa trong tập các đối tượng được sắp xếp tăng dần theo thuộc tính cắt lát Lưu ý: Các thuật toán dưới đây chỉ mô tả các bước quang trọng nhất hình thành thuật toán //Si : tập các điểm cần build //Ni : Node trả về sau khi build... 4.5 Thuật toán kd-Tree sử dụng Sliding MidPoint Thuật toán Split theo median đảm bảo cho cấu trúc cây gần như là cân bằng với mọi lát cắt split đều phải nằm ngay đối tượng giữa của tập đối tượng đã được sort trong node Điều này làm cho việc duyệt theo cây sẽ rất đơn giản và dễ tính ra được độ phức tạp cho một lần duyệt từ trên xuống dưới node lá Nếu sự phân bố các đối tượng đồng đều (random) trong không. .. kd-Tree và Search theo các nguyên tắc này gọi là tìm k-NN theo kdTree chuẩn bằng cách sử dụng cắt lát theo Median Tìm đối tượng gần nhất của đối tượng cho trước theo độ ưu tiên Phương pháp này tương tự như phương pháp chuẩn ở trên, tuy nhiên có một sự khác biệt là: Trong quá trình duyệt node tìm ra được khoảng cách, với phương pháp chuẩn thì sẽ quay ngược lên node cha để so sánh khoảng cách tìm được với... dần các node trong queue, thuật toán tìm k-NN xấp xỉ ANN hay còn gọi là Best Bin First ra đời để tìm giá trị k-NN gần đúng nhất với giá trị epsilon cho sẳn Tuy nhiên do giới hạn thời gian trong phạm vi bài biết này không đề cập đến thuật toán Best Bin First 4.4 Thuật toán kd-Tree sử dụng Median Phương pháp tìm hoàn toàn tương tự nguyên tắc chuẩn kd-Tree Chỉ có thay đổi 1 chút ít về cách build tree như

Ngày đăng: 11/04/2015, 14:30

Từ khóa liên quan

Mục lục

  • TÌM HIỂU THUẬT TOÁN

  • k-nearest neighborS (K-nn)

  • TRONG BỘ NHỚ THEO KHÔNG GIAN

  • GIỚI THIỆU

  • Nội Dung

    • I. Định nghĩa

    • II. Thuật toán k-NN Vét cạn

      • 2.1. Ý tưởng

      • 2.2. Thuật toán

      • 2.3. Phân tích độ phức tạp và nhận xét

      • III. Thuật toán k-NN cải tiến sau vét cạn

        • 3.1. Ý tưởng

        • 3.2. Phân tích độ phức tạp và nhận xét

        • IV. Thuật toán k-NN kd-Tree

          • 4.1. Ý tưởng

          • 4.2. Phân tích thuật toán QuadTree

          • 4.3. Phân tích thuật toán kd-Tree

            • kd-Tree là gì ?

            • Cấu trúc kd-Tree

            • Build kd-Tree

            • Tìm đối tượng gần nhất của đối tượng cho trước

            • Tìm đối tượng gần nhất của đối tượng cho trước theo độ ưu tiên

            • 4.4. Thuật toán kd-Tree sử dụng Median

            • 4.5. Thuật toán kd-Tree sử dụng Sliding MidPoint

Tài liệu cùng người dùng

Tài liệu liên quan