1. Trang chủ
  2. » Luận Văn - Báo Cáo

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

27 4,5K 23

Đ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

Thông tin cơ bản

Định dạng
Số trang 27
Dung lượng 4,33 MB

Nội dung

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 eucl

Trang 1

ĐẠI HỌC QUỐC GIA THÀNH PHỐ HỒ CHÍ MINH TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN

BÁO CÁO THU HOẠCH

MÔN PHƯƠNG PHÁP TOÁN TRONG TIN HỌC

ĐỀ TÀI:

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

Giảng viên: PGS.TS ĐỖ VĂN NHƠN

Học viên: Đỗ Văn Cang

Mã số: CH1001004 Lớp: Cao học CNTTQM – Khóa 8

Tháng 01 năm 2015

Trang 2

TÌM HIỂU THUẬT TOÁN K-NEAREST NEIGHBORS (K-NN)

TRONG BỘ NHỚ THEO KHÔNG GIAN

GIỚI THIỆU



Trang 3

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 vicủ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 giaodiệ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ó ứngdụ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 (datamining) 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áyhọ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êmcá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ìnhbà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

Trang 4

Mục Lục

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

k-nearest neighborS (K-nn) 2

TRONG BỘ NHỚ THEO KHÔNG GIAN 2

2

GIỚI THIỆU 2

Nội Dung 4

Kết luận 25

Nội Dung   

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

Trang 5

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 Ktheo đú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

InsertOrder(K, dis(pi,q),pi);

} }

K[0] (dis,p)

Trang 6

Độ 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ỏ

3.1 Ý tưởng

Bắt đầu nghĩ đến không gian (spatial partitioning strategy) ?!? phải có một cáchnà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ì khitheo 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 theovò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 choviệ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étduyệ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

Trang 7

- 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ôngkhả thi cho mọi trường hợp.

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

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ầncon 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

Trang 8

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ánkí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ìmkiế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ốithiể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, tuynhiê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ượngnodes như thế là không tốt lắm

Hình 3 Giới hạn tìm dựa vào R và các Nodes

Hình 2 Cây QuadTree

Trang 9

Có một cải thiện của QuadTree là trong quá trình build tree, node nào không chứa đốitượ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ánlà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ùngnhỏ 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

kd-Tree là gì ?

kd-Tree (k- dimension tree) thực chất là một BTree (Binary tree - cây nhị phân), sự khácbiệ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

Cấu trúc kd-Tree

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

Phương pháp cắt lát tại mỗi node

+ Chọn thuộc tính cắt lát

Trang 10

+ 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 trongLeafNode(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 conN1, N2 (hình 4.2)

- Tiếp tục cắt theo Oy 2 Node con còn lại

Trang 11

 N1 thành 2 node N3, N4

 N2 thành 2 node N5, N6 (hình 4.3)

- Xét Node N6 còn lại cắt theo Ox được 2 Nodes con N7,N8  tất cả các nodes được build (hình 4.4)

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

Nguyên tắc chung của việc tìm ra đối tượng trong tập S, lân cận gần nhất đốitượng cho trước q là cách duyệt cây theo chiều sâu ( sử dụng đệ quy) Tại một Node chotrước Ni, có thể đi theo 2 hướng trái hoặc phải Việc quyết định đi theo hướng nào là tùythuột vào việc so sánh giá trị của thuộc tính cắt lát (split dimention) của đối tượng q vớigiá trị cắt lát (Split Value) tại node đó

Trang 12

+ Nếu Ni là node lá LeafNode: tìm được đối tượng nghi vấn, cập nhật đối tượng này vàkhoảng cách từ q đến nó sẽ được cập nhật gọi là mindis(p).

+ Nếu Ni là node trung gian SplitNode, xét giá trị cắt lát của q với giá trị cắt lát tại Ni:

thì gọi đệ quy cho node con bên trái

- Nếu khoảng cách nhỏ nhất của đối tượng q đến phân vùng của node cònlại bên phải dis_right(Ni) : dis_right(Ni) < mindis(p) , tiếp tục thực hiện cho node bênphải này Ngược lại duyệt bên phải và kiểm tra bên trái

Quá trình này được thực hiện theo chiều sâu, lúc đầu cây sẽ được duyệt từ root đến lá khảnghi nhất, sau đó nó được so sánh khoảng cách với các khoảng cách các vủng lân cận,nếu thuận buồm xuôi gió thõa mãn điều kiện nhỏ hơn khoảng cách nhỏ nhất của tất cảcác vị trí nodes ở trên thì nó sẽ trả ngược về kết quả tại node root giá trị cần tìm Nếukhông , nó sẽ phải đào sâu vào các nhánh node cấp cha ông của nó Việc này tùy thuộcvào phân bố các đối tượng và nhất là cơ chế build tree ban đầu

Trong ví dụ trên, xét đối tượng X nằm tại vị trí như hình 4.5

Bây giờ ta hãy xem qua cách tìm kiếm đối tượng gần đối tượng X nhất

 Duyệt node gốc: giá trị duyệt node trái (N1)

Trang 13

 Duyệt N4 chứa B tính khoảng cách mindis(X) với B.

 Quay lại N1: so sánh mindis(X) với Dis(N1) : phân vùng N3 ta thấy rõ mindis(X) < Dis(N1) : vùng chữ nhật chứa A và C

Quay lại N0 : tương tự mindis(X) < Dis(N0) vùng chứa CDE

Kết thúc tại Root Với giá trị cần tím là B 

Các quá trình build Tree và Search theo các nguyên tắc này gọi là tìm k-NN theo Tree chuẩn bằng cách sử dụng cắt lát theo Median

kd-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 khoảng cách nhỏ nhất của q với node còn lại của cha nó… cho đến root, nhưng phương pháp này sẽ so sánh sánh khoảng cách tìm được với khoảng cách nhỏ nhất của q từ các node còn lại của cha đến node root bằng cách sử dụng một Sorted Queue theo khoảng cách để xác định sẽ tìm

đến node nào ngon nhất 

Như vậy trong quá trình duyệt và kiểm tra xét đến node lân cận, thay vì xét node lân cận tại node cha, thì chỉ xét node lân cận gần nhất trong các node lân cận ở tất cả các cấp trước đó và như thế có thể tìm được nhanh chóng hơn

Tuy nhiên, thực tế thì các node có mối quan hệ gần nhất lại là các node khả nghi nhất và chúng cũng chiếm phân vùng nhỏ nhất, do đó việc thực hiện theo phương pháp này, lúc đầu thì thấy rất là hay, nhưng khi cài đặt thực tế thì quá trình thay đổi Queue tốn chi phí

khá lớn và số cấp duyệt lại lớn hơn Lý do chính là các phân vùng các node ở cấp càng sát với root có độ rộng càng lớn.

Dựa vào ý tưởng thuật toán này và kết hợp với việc đo khoảng cách để loạ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

Trang 14

+ Chọn thuộc tính cắt lát: tại một node cần cắt lát, chọn thuộc tính có mà có độ dài củaphân vùng (các đối tượng) lớn nhất Thường giá trị này cũng chính là độ dài bao đóngcủ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ậttoán

//Si : tập các điểm cần build

//Ni : Node trả về sau khi build

//RECi : vùng bao chứa tập điểm Si.

//Bucketsize : số lượng tối đa đối tượng trong LeaftNode

Tree::BuildTree( Input : Si ,RECi, Output : Ni )

{

If Count(Si) <= BucketSize) then

Ni = new LeafNode(Si);

//khai báo

RECl, RECr, Sl, Sr,splitdimension

//Lấy các giá tri sau khi Split

SlitNode(Si,RECi,out splitdimension,out RECl,out RECr,out Sl, out Sr;

Childleft = BuildTree(Sl, RECl, Nl );

ChildRight = BuildTree(Sr, RECr,Nr);

Ni = new SplitNode( Si, RECi, splitdimension, Nl, Nr);

}

//Si : tập các điểm cần build

//RECi : vùng bao chứa tập điểm Si.

//SplitDimension : thuộc tính cắt lát

//REC(l) : vùng bao chứa tập bên trái

//S(l) : tập đối tượng bên trái

//REC(r), S(r) : bên phải

Tree::SplitNode( Input : Si ,input RECi, Output : splitdimension, output

RECl, output RECr, output Sl, output Sr)

{

//duyệt qua vùng REC (chỉ chứa 2 tập min và max theo thuộc tính )

FindSplitDimension(RECi , out splitdimension )

//Sort theo thuộc tính splitdimension

Trang 15

//go Right when max distance found is not good

if MaxDistance(result) > MinDistance(Right,q) then

//go Left when max distance found is not good

if MaxDistance(result) > MinDistance(Left,q) then

Left.FindNearestItem(q, result);

}

}

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ớimọ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 trongnode Đ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ứctạ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 gian thì các phân vùng

bao sẽ khá cân bằng giữa các thuộc tính (hình vuông trong 2 dimension), điều này làm cho việc tìm node gần nhất hầu như rất ít khả năng quay ngược lên duyệt lại con cháu của cha ông họ hàng của node đó Và khả năng tìm ra là nhanh nhất.

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

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w