Triển khai KNN kết hợp với bài toán điểm biên dựa trên Spark

Một phần của tài liệu ĐẠI QUY NHƠN (Trang 47)

Trong tập dữ liệu S, mỗi bản ghi định dạng dƣới dạng một bộ nhƣ

(s_id, c, , ,…, ), trong đó s_id là số nhận dạng của các bản ghi, c là phân loại và , ,…, là thuộc tính. Trong tập dữ liệu R, mỗi bản ghi định dạng dƣới dạng một bộ nhƣ(r_id, , …, ), trong đó r_id là định danh của bản ghi, , …, là thuộc tính.

Bởi vì cả tập huấn luyện và tập thử nghiệm có thể có kích thƣớc cao và tập dữ liệu lớn, làm thế nào để phân vùng chúng để KNN chạy trong Spark hiệu quả là một nhiệm vụ đầy thách thức. Có nhiều điểm chính khác cần đƣợc xem xét nhƣ số lƣợng bản đồ hoặc số lƣợng khối bộ nhớ cache trong S. Chúng tôi trình bày ý tƣởng chính và đƣa ra thuật toán cốt lõi.

(1) Đọc tập dữ liệu thử nghiệm lớn (R) thành m phân vùng. Nó có thể đƣợc triển khai đơn giản bởi Spark api. Điều này có nghĩa là sẽ có m nhiệm vụ bắt đầu và độ song song cũng là m.

(2) Đọc tập dữ liệu huấn luyện (S) vào biến quảng bá Spark. Giá trị của biến quảng bá sẽ đƣợc phân phối cho mỗi bộ nhớ nút phụ. Vì vậy, nếu bộ nhớ không thể chứa tất cả dữ liệu, chúng ta nên chia S thành n tập con (đƣợc biểu diễn bằng biến s_subset trong Thuật toán 1). Đầu tiên lấy một tập hợp con (tính toán trên dòng 3 của thuật toán 2.4.1) vào biến quảng bá để sử dụng, sau đó lặp lại cho đến khi tất cả các tập hợp con đƣợc sử dụng.

Thuật toán 2.4.1: Tách S thành biến Broadcast

1: val s_RDD = textFile (SPath)

3: val s_subset = sTotalNum / sCacheBlockNum // số bản ghi mỗi khối bộ nhớ cache

4: val s_broadcast = broadcast (lấy bản ghi s_subset từ S)

5: for (i = 1 to sCacheBlockNum) { 6: hoạt động khác sử dụng s_broadcast

7: s_broadcast = broadcast (lấy bản ghi s_subset khác từ S)

8: }

(3) Minh họa hoạt động trên dòng 6 của thuật toán 1. Hàm ánh xạ trên

R có thể đƣợc sử dụng để tính khoảng cách với tập con i của S cho mỗi bản ghi. Đối với cùng một khóa r_id, giá trị sẽ tạo thành một bản đồ phân loại khoảng cách (khoảng cách là khóa của bản đồ và phân loại là giá trị của bản đồ). Sau đó, cặp khóa-giá trị đƣợc xuất dƣới dạng (r_id, map <khoảng cách, phân loại>). Để sắp xếp các phần tử trong bản đồ theo khoảng cách, chúng tôi sử dụng TreeMap làm hiện thực của bản đồ. Thuật toán 2.4.2 cung cấp chi tiết của quá trình.

Thuật toán 2.4.2 : Ánh xạ R và cặp khóa-giá trị đầu ra 1: R.map {r =>

2: var map = new TreeMap (khoảng cách, phân loại) 3: foreach (s trong tập con của S) {

4: tính khoảng cách giữa r và s

5: sau đó đưa vào bản đồ (khoảng cách, phân loại) 6:}

7: return (r_id, bản đồ (khoảng cách, phân loại)) 8: }

các RDD để tạo thành một RDD cuối cùng. Khóa của RDD cuối cùng là r_id

và giá trị là danh sách bản đồ đƣợc biểu diễn dƣới dạng Danh sách <Bản đồ <khoảng cách, phân loại >>.

(5) Chức năng Reduce đƣợc sử dụng trên RDD cuối cùng, hợp nhất tất cả bản đồ trong danh sách, vì Bản đồ là TreeMap và tất cả các phần tử sẽ đƣợc sắp xếp theo khoảng cách. Sau đó, chúng tôi lấy k giá trị đầu tiên từ bản đồ và xác định phân loại. Đầu ra cũng là một cặp khóa-giá trị nhƣ (r_id, phân loại). Các bƣớc trên có thể đƣợc minh họa trong hình 2.10.

Hình 2.10. KNN kết hợp với bài toán điểm biên bằng Spark 2.5. TIỂU KẾT CHƢƠNG 2

Nội dung chƣơng 2 này, luận văn đã trình bày chi tiết từ ý tƣởng đến cách thức hoạt động của thuật toán KNN truyền thống. Đồng thời cũng chỉ ra những điểm hạn chế của thuật toán KNN khi đối diện với những bộ dữ liệu lớn. Qua đó chúng tôi trình bày ý tƣởng hợp thuật toán KNN và bài toán điểm biên để giải quyết cho bài toán dữ liệu lớn chạy trong Spark nhằm phát huy sức mạnh của KNN.

CHƢƠNG 3. CÀI ĐẶT MÔ PHỎNG THỰC NGHIỆM

Trong nội dung chƣơng cuối cùng này, trên cơ sở lý thuyết đã đƣợc trình bày ở chƣơng 1 và chƣơng 2. Dựa trên tìm hiểu và nghiên cứu các công cụ, thƣ viện mã nguồn mở tích hợp sẳn có nhằm rút ngắn quá trình lập trình. Cũng nhƣ tìm kiếm bộ dữ liệu nhằm mục tiêu cài đặt giải thuật KNN kết hợp với bài toán điểm biên đã đƣợc trình bày trong chƣơng 2 để tiến hanh cài đặt nó thông qua các công cụ mã nguồn mở đã đƣợc trình bày và giới thiệu.

3.1. MÔI TRƢỜNG VÀ CÔNG CỤ 3.1.1. Phát biểu bài toàn 3.1.1. Phát biểu bài toàn

Bài toán mô phỏng ở chƣơng này là xem xét bộ dữ liệu MNIST (Modified National Institute of Standards and Technology database) nhƣ là một bộ dữ liệu lớn, trong đó chúng tôi xem xét và xử lý dƣới góc độ là một bộ dữ liệu có số lƣợng lớn và mật độ phân bố hay lân cân giữa các điểm dữ liệu của bộ dữ liệu là dày đặc để tiến hành cài đặt thuật toán KNN kết hợp với bài toán điểm biên nhƣ đã trình bày ở chƣơng hai.

Cụ thể, đầu tiên luận văn sẽ tiến hành xử lý dữ liệu bằng bài toán phân điểm biên trên bộ dữ liệu này sau đó tiến hành thuật toán KNN cục bộ trên từng cụm dữ liệu thay vì áp dụng KNN cho toàn bộ quá trình tính toán trên tất cả các điểm dữ liệu và phân lớp các điểm dữ liệu trong bộ dữ liệu này trong Spark. Từ đó rút ra những nhận xét đánh giá cho việc vận dụng và giải quyết bài toán thực tế.

3.1.2. Môi trƣờng và ngôn ngữ lập trình

Để tiến hành cài đặt mô phỏng luận văn sử dụng hệ điều hành Windows 10, 64 bit và ngôn ngữ lập trình Python 3.7 chạy trên nền tảng Anacoda. Anaconda là một nền tảng phân phối miễn phí của ngôn ngữ lập trình Python và R cho tính toán khoa học (khai phá dữ liệu, khoa học dữ liệu, học máy, xử

lý dữ liệu lớn, phân tích dự đoán, v.v.), nhằm mục đích đơn giản hóa việc quản lý và triển khai. Nó có thể chạy trên cả Windows, MacOS và Linux.

3.1.3. Công cụ và thƣ viện

Luận văn sử dụng gói thƣ viện Pyspark, PySpark đã đƣợc phát hành để hỗ trợ sự hợp tác của Apache Spark. Spark là tên của công cụ để thực hiện tính toán cụm trong khi PySpark là thƣ viện của Python để sử dụng Spark. PySpark là một giao diện cho Apache Spark bằng Python. Nó không chỉ cho phép bạn viết các ứng dụng Spark bằng cách sử dụng các API Python mà còn cung cấp để phân tích tƣơng tác dữ liệu trong môi trƣờng phân tán. PySpark hỗ trợ hầu hết các tính năng của Spark nhƣ Spark SQL, DataFrame, Streaming, MLlib (Machine Learning) và Spark Core.

3.1.4. Bộ dữ liệu

Trong phần cài đạt này chúng tôi sử dụng bộ dữ liệu MNIST (Modified National Institute of Standards and Technology database). Là một cơ sở dữ liệu lớn chứa các chữ số viết tay thƣờng đƣợc dùng trong việc huấn luyện các hệ thống xử lý hình ảnh. Cơ sở dữ liệu này cũng đƣợc sử dụng rộng rãi để huấn luyện và kiểm thử trong lĩnh vực học máy.

3.2. CÀI ĐẶT MÔ PHỎNG 3.2.1. Cài đặt 3.2.1. Cài đặt

Trong phần này, các tính toán chủ yếu dựa trên khung dữ liệu spark hơn là RDD. Dự liệu đầu vào .Csv đƣợc đọc qua trình đọc spark csv và nó tạo Dataframe với nhãn và 784 cột đặc trƣng.

Hình 3.1. Đƣa bộ dữ liệu vào chƣơng trình

Sau đó, các khung dữ liệu này sẽ đi qua VectorAssember để tự định dạng.

Hình 3.2. Định dạng các khung dữ liệu

Bƣớc tiếp theo, kích thƣớc của các đặc trƣng sẽ đƣợc giảm bớt với sự trợ giúp của thuật toán PCA để đẩy nhanh quá trình chạy.

Trƣớc khi sử dụng KNN kết hợp với thuật toán điểm biêm nhƣ đã giới thiệu trong chƣơng 2, chúng tôi trích xuất pca_feature và nhãn của dữ liệu huấn luyện và tính toán chúng thành một mảng và quảng bá đến mỗi nút.

Hình 3.3. Trích xuất đặc trƣng và quảng bá đến mỗi nút.

Tiếp theo là tính toán KNN. Sau đó, sắp xếp ma trận theo hàng và trả về nhãn K đầu tiên. Nhãn xuất hiện nhiều nhất là nhãn dự đoán của điểm dữ liệu kiểm tra.

Hình 3.4. Tiến hành tính toán KNN 3.2.2. Các tham số và kết quả đạt đƣợc

Với cấu hình các thông số nhƣ sau: 8 trình thực thi, 2 lõi, PCA = 50, D = 5. Kết quả đạt đƣợc của chƣơng trình mô phòng đƣợc thể hiện ở hình 3.4. Để có thể đánh giá đƣợc các giá trị này, chúng ta sử dụng một ma trận đƣợc gọi là confusion matrix.

Hình 3.5. Kết quả đạt đƣợc

Cách tính sử dụng độ chính xác (accuracy) nhƣ ở trên chỉ cho chúng ta biết đƣợc bao nhiêu phần trăm lƣợng dữ liệu đƣợc phân loại đúng mà không chỉ ra đƣợc cụ thể mỗi loại đƣợc phân loại nhƣ thế nào, lớp nào đƣợc phân loại đúng nhiều nhất, và dữ liệu thuộc lớp nào thƣờng bị phân loại nhầm vào lớp khác.

3.2.3. So sánh và đánh giá kết quả đạt đƣợc

Ở lần chạy đầu tiên, chúng tôi sƣ dụng thuật toán KNN cổ điển để tiến hành phân lớp các điểm dữ liệu, đã tính toán chúng từng hàng một. Trong trƣờng hợp này, sẽ mất rất nhiều thời gian để hoàn thành tất cả các bƣớc thƣờng không hiệu quả. Cụ thể thời gian chạy với các thông số đã nêu là mất khoảng hơn 1 giờ để hoàn thành.

Ở các lần chạy tiếp theo chúng tôi tiến hành sử dụng thuật toán KNN kết hợp với bài toán điểm biên để tính toán dƣờng nhƣ tiết kiệm rất nhiều thời gian vì nó sẽ chỉ cần ánh xạ 10000 lần thay vì 600 triệu. Nó giúp tôi cắt giảm thời gian hoàn thành xuống chỉ còn 3 phút.

Sắp xếp luôn là công đoạn mất nhiều thời gian. Tôi đã sử dụng để sắp xếp một mảng hai chiều với nhãn trong một cột và khoảng cách trong các cột khác. Với sự trợ giúp của Argsort, tôi chỉ cần sắp xếp danh sách khoảng cách và nó sẽ trả về chỉ mục của danh sách theo thứ tự tăng dần. Sau đó, chúng ta chỉ cần sử dụng chỉ mục để ánh xạ danh sách nhãn và nó sẽ trả về nhãn theo thứ tự khoảng cách tăng dần. Theo cách này, trƣớc đây nó tốn 0,02 giây cho mỗi đầu ra và bây giờ nó tốn 0,0075 giây cho mỗi đầu ra, nhanh hơn 3 lần.

Broadcast - nó là một chức năng tích hợp của ngữ cảnh Sparkđể truyền các giá trị đến các nút khác nhau. Trong trƣờng hợp này, nút sẽ tiết kiệm thời gian thu thập ngữ cảnh mỗi lần từ nút chính. Tuy nhiên, trong những trƣờng hợp khác nhau, kết quả sẽ ngƣợc lại. Khi tôi chạy chƣơng trình với K = 5 và PCA = 50, chƣơng trình có phát chậm hơn chƣơng trình không có sóng 20 giây. Đối với chƣơng trình có K = 10 và PCA = 100, với sự trợ giúp của việc phát sóng, nó cắt giảm tổng thể hơn 70s. Do đó, nó có thể phụ thuộc vào tần suất hỏi ngữ cảnh từ nút chính. Nếu tần số đủ cao và việc phát sóng có thể giúp giảm tần suất. Ngƣợc lại, nếu tần số thấp, thời lƣợng phát sóng có thể lấn át thời gian hỏi tổng thể. Do đó, với đầu vào lớn hơn, việc sử dụng phát sóng sẽ trở nên cần thiết.

KẾT LUẬN

Luận văn đã tìm hiểu, nghiên cứu kết hợp thuật toán KNN và bài toán điểm biên trong Spark để giải quyết vấn đề dữ liệu hơn. Sau đó, chúng tôi tiến hình một chƣơng trình cài đặt mô phỏng cho KNN kết hợp với bài toan điểm biên dựa trên Spark. Kết quả cài đặt bƣớc đầu tƣơng đối khả quan đối với bộ dữ liệu thu thập đƣợc.

Một số hƣớng phát triển của đề tài:

Trong nghiên cứu tƣơng lai, chúng tôi sẽ đánh giá cách tiếp cận của chúng tôi trên các bộ dữ liệu lớn hơn với cùng dữ liệu và thông số đƣợc sử dụng trong luận văn này. Và chúng ta dự định tiếp tục nghiên cứu, cải tiến để triển khai cài đạt trên nhiều bộ dữ liệu hơn, tạo ra nhiều kết quả có giá trị hơn, hỗ trợ các truy vấn phức tạp hơn.

Chúng tôi có kế hoạch thực hiện các thử nghiệm mở rộng hơn cũng nhƣ sử dụng các công nghệ mới hơn nhƣ Spark để làm cho quá trình tính toán thậm nhanh.

TÀI LIỆU THAM KHẢO

[1].Usama Fayyad, Gregory Piatetsky-Shapiro, and Padhraic Smyth; From data mining to knowledge discovery in databases.

[2]. Hastie, Trevor; Tibshirani, Robert; Friedman, Jerome (2009). “The Elements of Statistical Learning: Data Mining, Inference, and Prediction”.

[3]. Hoàng Kiếm; Giáo trình nhập môn trí tuệ nhân tạo; NXB ĐHQGTPHCM 2000.

[4].Mehmed Kantardzic; Data mining concepts, models, methods, and algorithms; John Wiley & Sons, 2003.

[5]. Đỗ Phúc; Giáo trình khai thác dữ liệu; NXB ĐHQG TPHCM 2008.

[6]. Anchalia, P.P.; Roy, K. The k-Nearest Neighbor Algorithm Using MapReduce Paradigm. In Proceedings of the 2014 5th International Conference on Intelligent Systems, Modelling and Simulation, Langkawi, Malaysia, 27–29 January 2014; pp. 513–518.

[7]. Deng, Z.; Zhu, X.; Cheng, D.; Zong, M.; Zhang, S. Efficient kNN classification algorithm for big data. Neurocomputing 2016, 195, 143–148. [8]. Neeb, H.; Kurrus, C. Distributed K-Nearest Neighbors; Stanford

University Publishing: Stanford, CA, USA, 2016.

[9]. Yong, Z.; Youwen, L.; Shixiong, X. An improved KNN text classification algorithm based on clustering.J. Comput. 2009, 4, 230–237.

[10]. Deng, Z.; Zhu, X.; Cheng, D.; Zong, M.; Zhang, S. Efficient kNN classification algorithm for big data.Neurocomputing 2016, 195, 143–148.

Một phần của tài liệu ĐẠI QUY NHƠN (Trang 47)

Tải bản đầy đủ (PDF)

(57 trang)