Luận văn Nghiên cứu các kỹ thuật phân cụm dữ liệu và ứng dụng

Để phân cụm một cơ sở dữ liệu người ta có thể áp dụng rất nhiều phương pháp như phương pháp phân hoạch (partitioning), phương pháp phân cấp (hierarchical), phương pháp dựa trên mật độ (density-based), phương pháp dựa trên lưới (grid-based) . Mỗi phương pháp đều có ưu và nhược điểm khác nhau tuỳ thuộc vào yêucầu bài toán và cơ sở dữ liệu được phân cụm.

pdf101 trang | Chia sẻ: lylyngoc | Lượt xem: 2645 | Lượt tải: 1download
Bạn đang xem trước 20 trang tài liệu Luận văn Nghiên cứu các kỹ thuật phân cụm dữ liệu và ứng dụng, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
mà mỗi lần trả lời một câu truy vấn cần thời gian chạy là O(K) với K là số ơ lưới. Chú ý là N>>k. 54 Ưu điểm: - Tính tốn dựa trên lưới là truy vấn độc lập vì thơng tin thống kê được bảo quản trong mỗi ơ đại diện nên chỉ cần thơng tin tĩm tắt của dữ liệu trong ơ lưới chứ khơng phải dữ liệu thực tế và khơng phụ thuộc vào câu truy vấn. - Cấu trúc dữ liệu lưới thuận tiện cho quá trình xử lí song song và cập nhật liên tục. - Duyệt tồn bộ cơ sở dữ liệu cho một lần để tính tốn các đại lượng thống kê cho mỗi ơ, nên nĩ rất hiệu quả. Hạn chế: Mặc dù STING cĩ thể đưa ra một phân cụm tốt đáp ứng được yêu cầu của người sử dụng trong khoảng thời gian rất nhanh nhưng vẫn tồn tại hai vấn đề: 1) Thuật tốn chỉ dựa trên thuộc tính của các lá ở tầng cuối cùng; 2) Thuật tốn khơng dựa vào mối quan hệ giữa các nút con khơng cùng một cha. Vì thế, thuật tốn đưa ra được cụm với biên là chiều ngang và chiều dọc nhưng khơng đưa ra được biên cĩ chiều là đường chéo. Điều này cũng ảnh hưởng tới chất lượng của thuật tốn. 2.6.4.2. Thuật tốn CLIQUE CLIQUE (Clustering In QUEst) [10] được đề xuất năm 1998 bởi Agrawal, Gehrke, Gunopulos, Raghavan; CLIQUE là một hướng tiếp cận mật độ và phương pháp chia lưới áp dụng cho cơ sở dữ liệu nhiều chiều. Mơ hình thuật tốn phân cụm cho cơ sở dữ liệu nhiều chiều là hạn chế khơng gian tìm kiếm trong một khơng gian con (sub_space) thay vì thêm vào những chiều mới được tạo ra bằng cách tích hợp các chiều ban đầu. Hướng tiếp cận mật độ được áp dụng cho phép phân cụm trong khơng gian con đĩ. Với mục đích là xấp xỉ mật độ của điểm dữ liệu, mỗi một chiều sẽ được phân hoạch thành những khoảng bằng nhau dựa vào cách tiếp cận từ dưới lên. Độ lớn của mỗi phân hoạch là giống nhau và mật độ của phân hoạch cĩ thể coi như là số điểm bên trong phân hoạch đĩ. Những thơng số về mật độ sẽ được sử dụng để xác định khơng gian con. 55 Cụm được xác định trong khơng gian con bằng cách chia những điểm dữ liệu dựa vào hàm mật độ của các điểm và mật độ của một khơng gian con. Để đơn giản, mỗi cụm sẽ được giới hạn bởi một hình khối chữ nhật cĩ các cạnh song song với các trục. Các cụm được hình thành lên bằng cách nhĩm một số hình chữ nhật gối lên nhau. Hai tham biến dùng để phân hoạch khơng gian con và xác định đơn vị mật độ là  và  trong đĩ  là số khoảng với độ dài bằng nhau mà một khơng gian sẽ được chia,  là ngưỡng để xác định một khối cĩ là khối mật độ hay khơng. Thuật tốn gồm các bước cụ thể như sau Bước 1: Xác định miền khơng gian con chứa các cụm. Thuật tốn xử lý theo từng mức và sử dụng phương pháp dưới lên (bottom-up) để tìm ra những đơn vị mật độ. Đầu tiên sẽ đi duyệt qua tồn bộ cơ sở dữ liệu để tìm ra được đơn vị mật độ một chiều. Một đơn vị mật độ cha sẽ được xác định dựa vào những thơng tin cĩ sẵn trong những đơn vị con. Những khơng gian con được phủ bởi nhiều đơn vị mật độ nhất sẽ được lựa chọn và cắt bỏ những phần cịn lại. Những khơng gian con được sắp theo số điểm mật độ trong khơng gian đĩ… Bước 2: Tìm kiếm các cụm. Thuật tốn là tìm các thành phần liên thơng sử dụng các đơn vị như các đỉnh và giữa hai đỉnh cĩ một cạnh khi và chỉ khi chúng cĩ chung ít nhất một mặt. Một thuật tốn tìm kiếm theo chiều sâu được sử dụng để tìm ra những thành phần liên thơng của đồ thị. Các cụm được phụ thuộc vào số khối mật độ. Bước 3: Sinh ra đặc tả tối thiểu cho mỗi cụm (cụm được tạo ra từ bước 2). Với mỗi cụm, xác định vùng lớn nhất chứa cụm các đơn vị mật độ liên thơng. Tiếp đĩ xác định phủ tối tiểu (minimal cover) cho cụm đĩ. Độ phức tạp của thuật tốn phụ thuộc vào 3 phần: Xác định khơng gian con O(ck + mk) với k là hằng số, k là số chiều lớn nhất của các đơn vị mật độ và m là số điểm dữ liệu đầu vào. Thuật tốn sẽ đi qua dữ liệu k lần. Tại bước thứ 2, thuật tốn kiểm tra 2k điểm lân cận để tìm ra các miền liên thơng của các đơn vị mật độ. Độ phức tạp của bước cuối cùng là 2kn. Độ phức tạp của bước cuối cùng là O(n2) với n là số đơn vị mật độ. Thời gian chạy xấp xỉ biến đổi tuyến tính với kích thước của dữ liệu vì số lần duyệt qua dữ liệu là khơng thay đổi. Tuy nhiên, khi số chiều của dữ liệu tăng lên thì độ phức tạp cũng tăng rất nhanh. CLIQUE khơng phụ thuộc vào thứ tự vào ra của dữ liệu và khơng yêu cầu những thơng tin của dữ liệu trước. CLIQUE yêu cầu hai tham biến từ người sử dụng 56 và làm việc hiệu quả với dữ liệu nhiễu. Tuy nhiên khi gía trị  quá nhỏ thì sẽ cĩ những đơn vị chứa dữ liệu nhiễu nhưng vẫn được xem là đơn vị của cụm và xem như là một cụm. 2.6.5. Kết luận Mỗi một phương pháp phân cụm đều cĩ điểm mạnh điểm yếu và thích hợp cho từng ứng dụng cụ thể. 1) Phương pháp phân hoạch Phương pháp phân hoạch đơn giản, dễ áp dụng và hiệu quả đối với cơ sở dữ liệu nhỏ với các cụm đưa ra cĩ hình dạng lồi. Tuy nhiên, do các cụm trong phương pháp phân hoạch được biểu diễn bởi các tâm của cụm và mỗi một điểm dữ liệu được chia vào một cụm dựa vào khoảng cách từ điểm đĩ tới tâm của cụm. Chính vì thế phương pháp phân hoạch chỉ cĩ thể đưa ra được các cụm cĩ hình dạng là đa giác lồi mà khơng thể đưa ra được các cụm cĩ dạng lõm phủ lên nhau hoặc lồng nhau. Ngồi ra, nếu cơ sở dữ liệu cĩ nhiễu hoặc cĩ đối tượng dữ liệu quá xa tâm (outline) thì phương pháp phân cụm phân hoạch cùng khơng áp dụng được vì trong các trường hợp đĩ, các đối tượng dữ liệu nhiễu hoặc các đối tượng dữ liệu xa tâm (outline) sẽ làm tâm của cụm bị lệch đi. Do đĩ, khơng đưa ra được các cụm chính xác, ví dụ: 2) Phương pháp phân cấp: Thực hiện việc phân cụm bằng cách tách hoặc ghép các nhĩm đối tượng dựa vào độ tương đồng của các nhĩm đối tượng đĩ. Phương pháp này khơng cĩ khả năng phân cụm với hình dạng bất kỳ. Việc xây dựng lên cây cấu trúc tương đối phức tạp và phải duyệt cơ sở dữ liệu nhiều lần, dẫn tới thời gian chạy của các thuật tốn lớn. Ngồi ra, phương pháp phân cấp địi hỏi một khơng gian bộ nhớ để lưu giữ cây trong quá trình xây dựng. Do đĩ phương pháp này cũng khơng thích hợp với cơ sở dữ liệu lớn. 3) Phương pháp dựa trên mật độ: là một trong những phương pháp phân cụm hiệu quả, đặc biệt là cho những cơ sở dữ liệu khơng gian. Những thuật tốn thuộc phương pháp này khơng chỉ cĩ khả năng tìm ra những cụm với hình dáng bất kỳ mà cịn rất hiệu qủa khi áp dụng lên những cơ sở dữ liệu cĩ nhiễu. Mỗi phương pháp phân cụm cĩ ưu và nhược điểm riêng, phù hợp với từng loại ứng dụng. Tuỳ từng ứng dụng cụ thể mà người sử dụng sẽ chọn phương pháp phân cụm thích hợp nhất cho yêu cầu ứng dụng của mình. Trong một số 57 trường hợp, người ta cĩ thể kết hợp các phương pháp khác nhau để đưa ra một thuật tốn phân cụm hiệu quả hơn hoặc thích hợp hơn cho ứng dụng cụ thể. Tuy nhiên, những phương pháp và thuật tốn phân cụm hiện tại đều khơng thể áp dụng và phân cụm được cơ sở dữ liệu hỗn hợp gồm nhiều lớp đối tượng dữ liệu với tính chất khác nhau và chứa nhiều đối tượng dữ liệu hỗn hợp như cơ sở dữ liệu khơng gian. 4) Phương pháp dựa trên lưới (Gird-Based Methods). Phương pháp này thích hợp với dữ liệu nhiều chiều, được áp dụng chủ yếu cho lớp cơ sở dữ liệu khơng gian. Ví dụ như dữ liệu được biểu diễn dưới dạng cấu trúc hình học của đối tượng trong khơng gian cùng với các quan hệ, các thuộc tính, các hoạt động của chúng. Ưu điểm của phương pháp dựa trên lưới là thời gian xử lý nhanh và độc lập với số đối tượng dữ liệu trong tập dữ liệu ban đầu, thay vào đĩ là chúng phụ thuộc vào số ơ trong mỗi chiều của khơng gian lưới. 58 Chương 3: ỨNG DỤNG 3.1 Bài tốn: Phân cụm dữ liệu bản đồ Đơn vị hành chính việt Nam thành những vùng sao cho những đơn vị hành chính (tỉnh/ huyện/ xã) trong cùng một vùng được chia cĩ diện tích tương đương nhau. 3.2 Phân tích bài tốn a. Cơ sở dữ liệu: Bản đồ Đơn vị hành chính Việt Nam dưới dạng dữ liệu thuộc tính, được cung cấp từ Cục Cơng nghệ thơng tin – Bộ Tài nguyên và Mơi trường. b. Cơng nghệ sử dụng: Sử dụng thư viện ArcGIS Engine và cơng nghệ lưu trữ dữ liệu khơng gian Geodatabase của ESRI. Ngơn ngữ lập trình VS.Net 2008. c. Giải thuật: 59 Để phân cụm một cơ sở dữ liệu người ta cĩ thể áp dụng rất nhiều phương pháp như phương pháp phân hoạch (partitioning), phương pháp phân cấp (hierarchical), phương pháp dựa trên mật độ (density-based), phương pháp dựa trên lưới (grid-based)…. Mỗi phương pháp đều cĩ ưu và nhược điểm khác nhau tuỳ thuộc vào yêu cầu bài tốn và cơ sở dữ liệu được phân cụm. Trong đĩ phương pháp phân cụm dựa trên mật độ là phương pháp hiệu quả. Trên thực tế, phương pháp này đã được áp dụng đối với nhiều cơ sở dữ liệu lớn, dữ liệu khơng gian với nhiều mục đích khác nhau như: dịch bệnh, động đất, dân số … Với bài tốn đơn giản trên áp dụng giải thuật DBSCAN. Thuật tốn DBSCAN được hình thành dựa trên ý tưởng: những đối tượng trong cùng một cụm phải cĩ mật độ các điểm lân cận vượt qua một ngưỡng nào đĩ. Ví dụ như một điểm chỉ cĩ thể thuộc một cụm khi cĩ khơng ít hơn 3 đối tượng trong lân cận Eps. DBSCAN thực hiện việc phân cụm các đối tượng dữ liệu dựa vào mật độ của các đối tượng dữ liệu đĩ. Những cụm đối tượng do DBSCAN tìm ra cĩ hình dạng bất kỳ (lồi, lõm …). Ngồi ra, DBSCAN cịn cĩ thể phân biệt được dữ liệu nhiễu. Yêu cầu bài tốn: Khi áp dụng giải thuật DBSCAN với tham số Eps và Minpts thì các cụm đối tượng nhận được phải cĩ chung tính chất và thoả mãn điều kiện các đối tượng trong cùng một cụm đều cĩ mật độ các điểm trong lân cận Eps lớn hơn một số Minpts (với Eps và Minpts được nhập vào). Chính vì vậy, DBSCAN khơng áp dụng lên được những cơ sở dữ liệu mà mật độ các điểm trong các cụm khác nhau cĩ sự chênh lệch lớn. 3.3 Kết quả của ứng dụng - Với Minpt = 3, Epxilon = 200000000  Dữ liệu Bản đồ được chia làm 9 cụm và một cụm dữ liệu nhiễu (cĩ giá trị là -1) tương ứng với 10 màu thể hiện trên bản đồ. 60 Hình 3.1: Kết quả phân cụm với Minpt = 3, Epxilon = 200000000 Kết quả dữ liệu được phân cụm được thể hiện tương ứng trên với màu trên bản đồ: 61 Hình 3.2: Kết quả phân cụm trên dữ liệu thuộc tính và trên bản đồ Các cụm tương ứng với màu thể hiện trên bản đồ: Hình 3.3: Màu của các cụm thể hiện trên bản đồ 62 Ứng với mỗi màu là giá trị ngưỡng của từng vùng thể hiện diện tích của vùng đĩ : 1. Cụm 1 gồm các tỉnh cĩ diện tích trong bảng sau, cĩ màu tương ứng Tên tỉnh Diện tích Trà Vinh 2306466349.96141000 Hà Tây 2198420357.81812000 Bà Rịa 1897727768.00838000 TP.HCM 2066159606.10698000 Tiền Giang 2395682910.39683000 Bạc Liêu 2477845384.00060000 Bến Tre 2335831224.56328000 2. Cụm 2 gồm các tỉnh cĩ diện tích trong bảng sau, cĩ màu tương ứng Tên tỉnh Diện tích Bình Thuận 7931209499.87932000 Hà Giang 7965348879.95733000 Quảng Bình 7970535688.36433000 3. Cụm 3 gồm các tỉnh cĩ diện tích trong bảng sau, cĩ màu tương ứng Tên tỉnh Diện tích Long An 4494400782.31278000 Quảng Ngãi 5160704548.38619000 Quảng Trị 4732815713.60740000 Thừa Thiên Huế 4910723589.51324000 Hồ Bình 4646402537.94947000 Bắc Kạn 4859193597.45612000 Cà Mau 5218144748.70507000 Phú Yên 5044337921.47458000 Khánh Hồ 4654650767.56896000 4. Cụm 4 gồm các tỉnh cĩ diện tích trong bảng sau, cĩ màu tương ứng Tên tỉnh Diện tích Cần Thơ 1390738787.01743000 Hậu Giang 1668524192.12805000 Nam Định 1578709366.54696000 Thái Bình 1568190494.59102000 Hải Dương 1669703560.86509000 Hải Phịng 1469150996.24841000 Vĩnh Long 1525182363.36492000 63 Vĩnh Phúc 1379593422.68810000 Ninh Bình 1344958616.31649000 5. Cụm 5 gồm các tỉnh cĩ diện tích trong bảng sau, cĩ màu tương ứng Tên tỉnh Diện tích Hà Nội 928687598.12337200 Hà Nam 858716696.47997500 Bắc Ninh 820360699.39168500 Đà Nẵng 970907556.69338800 Hưng Yên 928999578.03190100 6. Cụm 6 gồm các tỉnh cĩ diện tích trong bảng sau, cĩ màu tương ứng Tên tỉnh Diện tích Bình Phước 6877419453.00542000 Yên Bái 6882479934.64777000 Cao Bằng 6731253213.19871000 7. Cụm 7 gồm các tỉnh cĩ diện tích trong bảng sau, cĩ màu tương ứng Tên tỉnh Diện tích Ninh Thuận 3365499564.62857000 Đồng Tháp 3384872662.40878000 An Giang 3531270754.93136000 Phú Thọ 3528100941.97684000 Sĩc Trăng 3279399781.94320000 Thái Nguyên 3519460811.98890000 8. Cụm 8 gồm các tỉnh cĩ diện tích trong bảng sau, cĩ màu tương ứng Tên tỉnh Diện tích Bình Định 6088895513.91577000 Kiên Giang 5671223574.45134000 Đồng Nai 5864516875.34936000 Hà Tĩnh 5965176316.08120000 Tuyên Quang 5856151989.93284000 64 9. Cụm 9 gồm các tỉnh cĩ diện tích trong bảng sau, cĩ màu tương ứng Tên tỉnh Diện tích KonTum 9701408885.31946000 Lâm Đồng 9805398945.81017000 Điện Biên 9555554460.34819000 10. Dữ liệu nhiễu, gồm các tỉnh cĩ trong bảng sau, cĩ màu tương ứng : Tên tỉnh Diện tích Lai Châu 9064692970.74260000 Dak Lak 13056916420.91960000 Thanh Hĩa 11081201760.42950000 Bình Dương 2694298932.12171000 Lạng Sơn 8332655997.71043000 Gia Lai 15546790014.26880000 Nghệ An 16472772022.04940000 Lào Vai 6365280822.59326000 Quảng Nam 10575354974.70630000 Tây Ninh 4038211065.51171000 Quảng Ninh 8338898984.12761000 Bắc Giang 3891015737.61691000 Sơn La 14109151761.35610000 Dak Nong 6513693510.52517000 Kết luân: Trên đây là cài đặt thử nghiệm giải thuật DBSCAN với bài tốn phân cụm dữ liệu bản đồ cả nước dựa vào diện tích các tỉnh. Đây là một bài tốn đơn giản là một ứng dụng phân cụm dựa trên diện tích (hoặc tương tự với các tham số khác như: phân cụm về dân số, loại đất, cháy rừng, động đất, dịch bệnh ...) Tuy nhiên, tùy vào yêu cầu từng bài tốn thực tế mà cĩ thể phát triển bài tốn trên thành sản phẩm hồn chỉnh cĩ thể ứng dụng rộng rãi. 65 KẾT LUẬN  Các vấn đề đã được tìm hiểu trong luận văn Luận văn tập trung nghiên cứu tổng quan về KPDL nĩi chung và PCDL nĩi riêng và áp dụng giải thuật DBSCAN để phân cụm bản đồ hành chính Việt Nam dựa trên diện tích của các tỉnh trên cả nước. Đây là bước khởi đầu trong quá trình tìm hiểu những vấn đề cần quan tâm khi giải quyết các bài tốn khai phá dữ liệu trong thực tế. Những kết quả mà luận văn đã thực hiện: + Về lý thuyết, luận văn tập trung tìm hiểu một số kỹ thuật phân cụm. + Về thực tiễn, luận văn đã đưa ra các kết quả cài đặt thử nghiệm của bài tốn phân cụm bản đồ Đơn vị hành chính Việt Nam dựa vào diện tích các tỉnh trên cả nước bằng giải thuật DBSCAN. Đây là một bài tốn đơn giản là một ứng dụng phân cụm dựa trên diện tích hoặc tương tự với các tham số khác như: phân cụm về dân số, loại đất, cháy rừng, động đất, dịch bệnh ... tùy vào từng bài tốn thực tế mà cĩ thể phát triển thành sản phẩm hồn chỉnh cĩ thể ứng dụng rộng rãi. Qua quá trình thực nghiệm và nghiên cứu lý thuyết cĩ thể đưa ra một số kết luận như sau: • Mỗi một giải thuật phân cụm áp dụng cho một số mục tiêu và kiểu dữ liệu nhất định. • Mỗi giải thuật cĩ một mức độ chính xác riêng và khả năng thực hiện trên từng kích thước dữ liệu là khác nhau. Điều này cịn tuỳ thuộc vào cách thức tổ chức dữ liệu ở bộ nhớ chính, bộ nhớ ngồi... của các giải thuật. • Khai phá dữ liệu sẽ hiệu quả hơn khi bước tiền xử lý, lựa chọn thuộc tính, mơ hình được giải quyết tốt.  Hướng nghiên cứu tiếp theo Hướng phát triển tiếp theo của đề tài là đi sâu vào nghiên cứu các kỹ thuật phân cụm áp dụng với cơ sở dữ liệu khơng gian để áp dụng vào giải quyết các bài phân cụm cơ sở dữ liệu khơng gian ứng dụng trong ngành Tài nguyên và Mơi trường. 66 TÀI LIỆU THAM KHẢO Tiếng Việt [1]. Vũ Đức Thi, Cơ sở dữ liệu – Kiến thức và thực hành, Nhà xuất bản Thống kê, 1997 [2]. Nguyễn Xuân My, Hỗ Sĩ Đàm, Trần Đỗ Hùng, Lê Sĩ Quang, Một số vấn đề về chọn lọc trong mơn tin học, Nhà xuất bản Giáo dục, 2002, Trang 73- 108 [3]. Phan Đình Diệu, Tri thức là gì? Đại học Quốc gia Hà Nội. Tiếng Anh [4]. Han J. and Kamber M., Data Mining: Concepts and Techniques, Morgan Kaufman, Academic Press. 2001. [5]. Burosch G., Demetrovics J., Katona G. O. H. (1987), The poset of closures as a model of changing databases, Oder 4, pp. 127-142. [6]. J.R, QUINLAN, Machine Learning 1, 81-106, 1986, © 1986 Kluwer Academic Publishers, Boston - Manufactured in The Netherlands. [7]. H. Huang, X. Wu, and R.Relue (2002), Asociation analysis with one scan of databases. In IEEE International Conference on Data Mining, pages 629-836, Decenber. [8]. Utgoff P.E, Article: Incremental induction of Decision Trees, Univerity of Massacuhsetts, 1989. [9].Tutorial: Decision Tree: ID3, Monhash University, 2003, [10]. Agrawal, Rakesh, Johannes Gehrke, Dimitrios Gunopulos and Prahhakar Raghavan. Automatic Subspace Clustering of High Dimensional Data for Data Mining Applications. Proceedings of the 1998 ACM-SIGMOD International Conference on Management of Data, Seattle, Washington, June 1998. [11]. Ester, Martin, Hans-Peter Kriegel, Jưrg Sander and Xiaowei Xu.(1996). A Density-Based Algorithm for Discovering Clusters in Large Spatial Databases with Noise. Proceedings of the 2nd International Conference on Knowledge Discovery and Data Mining (KDD-96). Portland, Oregon, August 1996. 67 [12]. Guha, Sudipto, Rajeev Rastogi and Kyuseok Shim. (1998). CURE: An Efficient Clustering Algorithm for Large Databases. Proceedings of ACM SIGMOD-International Conference on Management of Data. New York, NY 1998. pp 73—84. (CURE) [13]. Hinneburg, Alexander and Daniel A Keim. (1998). An Efficient Approach to Clustering in Large Multimedia Databases with Noise. Proceedings of the 4th International Conference on Knowledge Discovery and Data Mining, (KDD98). New York, August 1998. pp. 58—65. [14]. Pavel Berkhin, Survey of Clustering Data Mining Techniques. Accrue Software, Inc., San Jose. [15] Ng, Raymond T. and Jiawei Han. Efficient and Effective Clustering Methods for Spatial Data Mining. Proceedings of the 20th Very Large Databases- Conference (VLDB 94), Santiago, Chile. pp 144-155. (CLARAN) [16] Wang, Wei, Jiong Yang, and Richard Muntz, STING: A Statistical Information Grid Approach to Spatial Data Mining. Proceedings of the 23rd Very Large Databases Conference (VLDB 1997), Athens, Greece, 1997. [17] Zhang, Tian, Raghu Ramakrishnan, and Miron Chinh hay Livny. (1996). BIRCH: An Efficient Data Clustering Method for Very Large Databases. Proceedings of the 1996 ACM SIGMOD International Conference on Management of Data, Montreal, Canada, pp. 103-114, 1996. 68 PHỤ LỤC PHỤ LỤC 1: GIAO DIỆN CHƯƠNG TRÌNH Hình 3.4: Giao diện chương trình Phân cụm dữ liệu bằng thuật tốn DBSCAN 69 Hình 3.5: Giao diện chương trình sau khi thực hiên phân cụm 70 Hình 3.6: Kết quả phân cụm 71 PHỤ LỤC 2 MÃ NGUỒN MỘT SỐ MODUL TRONG CHƯƠNG TRÌNH =============Thực hiện phân cụm============== using System; using System.Collections.Generic; using System.Text; using System.Data; namespace DBScanProject { public class DataPoint { public bool Core = false; public int Cluster = 0; public bool Visited = false; public int id; public double d1; public double d2; public DataPoint(int _id, double x, double y) { id = _id; d1 = x; d2 = y; } public double Distance(DataPoint dp) { if (this != dp) { double d1sq = (d1 - dp.d1) * (d1 - dp.d1); double d2sq = (d2 - dp.d2) * (d2 - dp.d2); return Math.Sqrt(d1sq + d2sq); } else return 0; } public void SetVisited() { Visited = true; return; } public void SetCore() 72 { Core = true; return; } public void SetCluster(int C) { Cluster = C; return; } } public class KnearestInf { public int Point; public double Dist; public KnearestInf(int _Point, double _Dist) { Point = _Point; Dist = _Dist; } } public class clsDBScan { public DataPoint[] DPs; public clsDBScan(DataSet ds) { DPs = new DataPoint[ds.Tables[0].Rows.Count]; int i; for (i = 0; i < DPs.Length; i++) { int _id = Convert.ToInt32(ds.Tables[0].Rows[i]["objectid"].ToString()); double _x = Convert.ToDouble(ds.Tables[0].Rows[i]["x"].ToString()); double _y = Convert.ToDouble(ds.Tables[0].Rows[i]["y"].ToString()); DataPoint P = new DataPoint(_id, _x, _y); DPs[i] = P; } } public DataPoint[] Get_Neighbors(DataPoint P, double eps) { DataPoint[] kq = new DataPoint[DPs.Length]; int i, k; k = 0; for (i = 0; i < DPs.Length; i++) { 73 if (P.Distance(DPs[i]) <= eps && P.id != DPs[i].id) { kq[k] = DPs[i]; k++; } } Array.Resize(ref kq, k); return kq; } public DataPoint[] Join_Neighbors(DataPoint[] Ng1, DataPoint[] Ng2) { DataPoint[] kq = new DataPoint[Ng1.Length + Ng2.Length]; int i, j, k; Boolean exis; k = 0; Array.Copy(Ng1, 0, kq, 0, Ng1.Length); for (i = 0; i < Ng2.Length; i++) { exis = false; for (j = 0; j < Ng1.Length; j++) { if (Ng2[i].id == Ng1[j].id) { exis = true; break; } } if (exis == false) { kq[Ng1.Length + k] = Ng2[i]; k++; } } Array.Resize(ref kq, Ng1.Length + k); return kq; } public void DBCluster(int Minpts, double eps) { int i; int C = 0; for (i = 0; i < DPs.Length; i++) { if (DPs[i].Visited == false) 74 { DPs[i].SetVisited(); //Tìm các điểm lân cận DataPoint[] N = Get_Neighbors(DPs[i], eps); if (N.Length >= Minpts) { //Điểm là Core C++; //Tạo nhĩm và mở rộng nhĩm ExpanCluter(DPs[i], N, C, Minpts, eps); } } } } public void ExpanCluter(DataPoint P, DataPoint[] N, int C, int Minpts, double eps) { //Add P to Cluster C P.SetCluster(C); int i; i = 0; while (i < N.Length) { if (Check_Visited(N[i]) == false) { //Set Visited N[i].SetVisited(); Set_Visited(N[i]); //Tim cac lan can DataPoint[] N1 = Get_Neighbors(N[i], eps); if (N1.Length >= Minpts) { N = Join_Neighbors(N, N1); } if (Check_Cluster(N[i]) == 0) { N[i].SetCluster(C); Set_Cluster(N[i], C); } } i++; } } 75 public Boolean Check_Visited(DataPoint P) { int i; for (i = 0; i < DPs.Length; i++) { if (P.id == DPs[i].id) { return DPs[i].Visited; } } return false; } public int Check_Cluster(DataPoint P) { int i; for (i = 0; i < DPs.Length; i++) { if (P.id == DPs[i].id) { return DPs[i].Cluster; } } return -1; } public void Set_Visited(DataPoint P) { int i; for (i = 0; i < DPs.Length; i++) { if (P.id == DPs[i].id) { DPs[i].SetVisited(); return; } } return; } public void Set_Core(DataPoint P) { int i; for (i = 0; i < DPs.Length; i++) { if (P.id == DPs[i].id) 76 { DPs[i].SetCore(); return; } } return; } public void Set_Cluster(DataPoint P, int C) { int i; for (i = 0; i < DPs.Length; i++) { if (P.id == DPs[i].id) { DPs[i].SetCluster(C); return; } } return; } public DataSet CreateDS() { DataSet ds = new DataSet("dsDBScan"); DataTable tb = new DataTable("tblDBScan"); DataColumn _id = new DataColumn("id"); DataColumn _cluster = new DataColumn("Cluster"); DataColumn _x = new DataColumn("x"); DataColumn _y = new DataColumn("y"); tb.Columns.Add(_id); tb.Columns.Add(_cluster); tb.Columns.Add(_x); tb.Columns.Add(_y); ds.Tables.Add(tb); return ds; } public void Get_Result() { DataSet ds = CreateDS(); int i; for (i = 0; i < DPs.Length; i++) { DataRow dr = ds.Tables[0].NewRow(); dr["id"] = DPs[i].id; 77 dr["cluster"] = DPs[i].Cluster; dr["x"] = DPs[i].d1; dr["y"] = DPs[i].d2; ds.Tables[0].Rows.Add(dr); } //ds.WriteXml("c:\\ketquaDBScan.xml"); } public int CountCluster() { int c = 0; int i; for (i = 0; i < DPs.Length; i++) { c = Math.Max(c, DPs[i].Cluster); } c = c + 1; return c; } public clsArrayPoints2D[] Get_ArrayPoints2D() { clsArrayPoints2D[] kq = new clsArrayPoints2D[CountCluster()]; int i, idx; idx = -1; for (i = 0; i < DPs.Length; i++) { idx = DPs[i].Cluster; clsPoint2D p2d = new clsPoint2D(DPs[i].d1, DPs[i].d2); if (kq[idx] == null) { kq[idx] = new clsArrayPoints2D(p2d); } else { kq[idx].Add(p2d); } } return kq; } public double CalcKNearest(int K) { int i, j, Size,Pos; Double Dist,DistMax; DistMax = -1; 78 for (i = 0; i < DPs.Length; i++) { KnearestInf[] Knearest = new KnearestInf[K]; Size = 0; for (j = 0; j < DPs.Length; j++) { Dist = 0; if (j != i) { Dist = Math.Sqrt( Math.Pow((DPs[i].d1 - DPs[j].d1),2) + Math.Pow((DPs[i].d2 - DPs[j].d2),2)); if (Size < K) { KnearestInf kn = new KnearestInf(j,Dist); Knearest[Size]=kn; //Knearest[Size].Point = j; Size = Size + 1; } else { Pos = GetMax(Knearest); if (Dist < Knearest[Pos].Dist) { Knearest[Pos].Dist = Dist; Knearest[Pos].Point = j; } } } } Pos = GetMax(Knearest); Dist = Math.Sqrt(Math.Pow((DPs[i].d1 - DPs[Knearest[Pos].Point].d1),2) + Math.Pow((DPs[i].d2 - DPs[Knearest[Pos].Point].d2), 2)); if (Dist > DistMax) { DistMax = Dist; } //DPs[i].KNearestDist = Dist; } return DistMax; //Call SortAuxArray(DataSet) } public int GetMax(KnearestInf[] Knearest) { 79 int i, Pos; double Mx; Mx = -1; Pos = -1; for (i = 0; i < Knearest.Length; i++) { if (i == 0) { Mx = Knearest[i].Dist; Pos = i; } else { if (Knearest[i].Dist > Mx) { Mx = Knearest[i].Dist; Pos = i; } } } return Pos; } public DataSet Get_Dataset(DataSet _dsIn) { DataSet _dsOut = _dsIn; int i,j; for (i = 0; i < _dsOut.Tables[0].Rows.Count; i++) for (j = 0; j<DPs.Length; j++) { if (_dsOut.Tables[0].Rows[i]["objectid"].ToString() == DPs[j].id.ToString()) { _dsOut.Tables[0].Rows[i]["cluster"] = DPs[j].Cluster; break; } } return _dsOut; } } } =============Giao diện chương trình============== using System; 80 using System.Drawing; using System.Collections; using System.ComponentModel; using System.Windows.Forms; using System.Data; using ESRI.ArcGIS.ADF.COMSupport; using ESRI.ArcGIS.Carto; using ESRI.ArcGIS.Controls; using ESRI.ArcGIS.Display; using ESRI.ArcGIS.esriSystem; using ESRI.ArcGIS.Geodatabase; using ESRI.ArcGIS.Geometry; using ESRI.ArcGIS.Utility; using System.Data.OleDb; using DBscan; namespace Renderers { public class Form1 : System.Windows.Forms.Form { private AxMapControl axMapControl1; private IGeoFeatureLayer m_pGeoFeatureLayer; private AxTOCControl axTOCControl; private System.Windows.Forms.Label label4; private System.Windows.Forms.Label label5; private System.Windows.Forms.ComboBox cboField; private System.Windows.Forms.ComboBox cboLayer; private System.Windows.Forms.ImageList imgView; private System.ComponentModel.IContainer components; IAoInitialize m_AoInitialize; private Button btn_OK; private AxLicenseControl axLicenseControl1; private Panel panel1; private SplitContainer splitContainer1; private Label label1; private TextBox txt_Epxilon; private TextBox txt_Minpt; private Label label2; private TabControl tabControl1; private TabPage tabPage1; private TabPage tabPage2; private DataGridView dataGridView1; private AxToolbarControl axToolbarControl1; private StatusStrip statusStrip1; 81 private ToolStripStatusLabel toolStripStatusLabel1; private AxToolbarControl axToolbarControl2; private int iKeyPressed=0; public Form1() { InitializeComponent(); } protected override void Dispose( bool disposing ) { if( disposing ) { if (components != null) { components.Dispose(); } } base.Dispose( disposing ); } #region Windows Form Designer generated code private void InitializeComponent() { this.components = new System.ComponentModel.Container(); System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(Form1)); this.axMapControl1 = new ESRI.ArcGIS.Controls.AxMapControl(); this.axTOCControl = new ESRI.ArcGIS.Controls.AxTOCControl(); this.label4 = new System.Windows.Forms.Label(); this.cboField = new System.Windows.Forms.ComboBox(); this.label5 = new System.Windows.Forms.Label(); this.cboLayer = new System.Windows.Forms.ComboBox(); this.imgView = new System.Windows.Forms.ImageList(this.components); this.btn_OK = new System.Windows.Forms.Button(); this.axLicenseControl1 = new ESRI.ArcGIS.Controls.AxLicenseControl(); this.panel1 = new System.Windows.Forms.Panel(); this.txt_Epxilon = new System.Windows.Forms.TextBox(); this.txt_Minpt = new System.Windows.Forms.TextBox(); this.splitContainer1 = new System.Windows.Forms.SplitContainer(); this.tabControl1 = new System.Windows.Forms.TabControl(); this.tabPage1 = new System.Windows.Forms.TabPage(); this.tabPage2 = new System.Windows.Forms.TabPage(); this.dataGridView1 = new System.Windows.Forms.DataGridView(); this.axToolbarControl1 = new ESRI.ArcGIS.Controls.AxToolbarControl(); this.statusStrip1 = new System.Windows.Forms.StatusStrip(); 82 this.toolStripStatusLabel1 = new System.Windows.Forms.ToolStripStatusLabel(); this.axToolbarControl2 = new ESRI.ArcGIS.Controls.AxToolbarControl(); this.label2 = new System.Windows.Forms.Label(); this.label1 = new System.Windows.Forms.Label(); ((System.ComponentModel.ISupportInitialize)(this.axMapControl1)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.axTOCControl)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.axLicenseControl1)).BeginInit() this.panel1.SuspendLayout(); this.splitContainer1.Panel1.SuspendLayout(); this.splitContainer1.Panel2.SuspendLayout(); this.splitContainer1.SuspendLayout(); this.tabControl1.SuspendLayout(); this.tabPage1.SuspendLayout(); this.tabPage2.SuspendLayout(); ((System.ComponentModel.ISupportInitialize)(this.dataGridView1)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.axToolbarControl1)).BeginInit( ); this.statusStrip1.SuspendLayout(); ((System.ComponentModel.ISupportInitialize)(this.axToolbarControl2)).BeginInit( ); this.SuspendLayout(); // // axMapControl1 // this.axMapControl1.Dock = System.Windows.Forms.DockStyle.Fill; this.axMapControl1.Location = new System.Drawing.Point(0, 28); this.axMapControl1.Name = "axMapControl1"; this.axMapControl1.OcxState = ((System.Windows.Forms.AxHost.State)(resources.GetObject("axMapControl1.Oc xState"))); this.axMapControl1.Size = new System.Drawing.Size(666, 569); this.axMapControl1.TabIndex = 0; // // axTOCControl // this.axTOCControl.Dock = System.Windows.Forms.DockStyle.Fill; this.axTOCControl.Location = new System.Drawing.Point(3, 3); this.axTOCControl.Name = "axTOCControl"; this.axTOCControl.OcxState = ((System.Windows.Forms.AxHost.State)(resources.GetObject("axTOCControl.Ocx State"))); 83 this.axTOCControl.Size = new System.Drawing.Size(258, 565); this.axTOCControl.TabIndex = 49; // // label4 // this.label4.AutoSize = true; this.label4.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); this.label4.Location = new System.Drawing.Point(227, 9); this.label4.Name = "label4"; this.label4.Size = new System.Drawing.Size(63, 16); this.label4.TabIndex = 51; this.label4.Text = "Tiêu chí"; // // cboField // this.cboField.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; this.cboField.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); this.cboField.Location = new System.Drawing.Point(296, 5); this.cboField.Name = "cboField"; this.cboField.Size = new System.Drawing.Size(117, 24); this.cboField.TabIndex = 52; // // label5 // this.label5.AutoSize = true; this.label5.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); this.label5.Location = new System.Drawing.Point(11, 9); this.label5.Name = "label5"; this.label5.Size = new System.Drawing.Size(88, 16); this.label5.TabIndex = 53; this.label5.Text = "Lớp dữ liệu:"; // // cboLayer // this.cboLayer.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; 84 this.cboLayer.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); this.cboLayer.Location = new System.Drawing.Point(105, 6); this.cboLayer.Name = "cboLayer"; this.cboLayer.Size = new System.Drawing.Size(116, 24); this.cboLayer.TabIndex = 54; this.cboLayer.SelectedIndexChanged += new System.EventHandler(this.cboLayer_SelectedIndexChanged); // // imgView // this.imgView.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject("imgView.Ima geStream"))); this.imgView.TransparentColor = System.Drawing.Color.Silver; this.imgView.Images.SetKeyName(0, ""); this.imgView.Images.SetKeyName(1, ""); this.imgView.Images.SetKeyName(2, ""); this.imgView.Images.SetKeyName(3, ""); this.imgView.Images.SetKeyName(4, ""); this.imgView.Images.SetKeyName(5, ""); this.imgView.Images.SetKeyName(6, ""); this.imgView.Images.SetKeyName(7, ""); this.imgView.Images.SetKeyName(8, ""); this.imgView.Images.SetKeyName(9, ""); // // btn_OK // this.btn_OK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.T op | System.Windows.Forms.AnchorStyles.Right))); this.btn_OK.BackColor = System.Drawing.SystemColors.ButtonFace; this.btn_OK.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); this.btn_OK.Location = new System.Drawing.Point(772, 3); this.btn_OK.Name = "btn_OK"; this.btn_OK.Size = new System.Drawing.Size(164, 26); this.btn_OK.TabIndex = 56; this.btn_OK.Text = "Thực hiện phân cụm"; this.btn_OK.UseVisualStyleBackColor = false; this.btn_OK.Click += new System.EventHandler(this.OK_Click); 85 // // axLicenseControl1 // this.axLicenseControl1.Enabled = true; this.axLicenseControl1.Location = new System.Drawing.Point(47, 182); this.axLicenseControl1.Name = "axLicenseControl1"; this.axLicenseControl1.OcxState = ((System.Windows.Forms.AxHost.State)(resources.GetObject("axLicenseControl1. OcxState"))); this.axLicenseControl1.Size = new System.Drawing.Size(32, 32); this.axLicenseControl1.TabIndex = 57; // // panel1 // this.panel1.Controls.Add(this.txt_Epxilon); this.panel1.Controls.Add(this.txt_Minpt); this.panel1.Controls.Add(this.splitContainer1); this.panel1.Controls.Add(this.btn_OK); this.panel1.Controls.Add(this.axLicenseControl1); this.panel1.Controls.Add(this.cboLayer); this.panel1.Controls.Add(this.cboField); this.panel1.Controls.Add(this.label2); this.panel1.Controls.Add(this.label1); this.panel1.Controls.Add(this.label5); this.panel1.Controls.Add(this.label4); this.panel1.Dock = System.Windows.Forms.DockStyle.Fill; this.panel1.Location = new System.Drawing.Point(0, 0); this.panel1.Name = "panel1"; this.panel1.Size = new System.Drawing.Size(948, 635); this.panel1.TabIndex = 58; // // txt_Epxilon // this.txt_Epxilon.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); this.txt_Epxilon.Location = new System.Drawing.Point(656, 5); this.txt_Epxilon.Name = "txt_Epxilon"; this.txt_Epxilon.Size = new System.Drawing.Size(100, 22); this.txt_Epxilon.TabIndex = 60; // // txt_Minpt // 86 this.txt_Minpt.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); this.txt_Minpt.Location = new System.Drawing.Point(478, 5); this.txt_Minpt.Name = "txt_Minpt"; this.txt_Minpt.Size = new System.Drawing.Size(107, 22); this.txt_Minpt.TabIndex = 59; // // splitContainer1 // this.splitContainer1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles. Top | System.Windows.Forms.AnchorStyles.Bottom) | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); this.splitContainer1.Location = new System.Drawing.Point(3, 35); this.splitContainer1.Name = "splitContainer1"; // // splitContainer1.Panel1 // this.splitContainer1.Panel1.Controls.Add(this.tabControl1); // // splitContainer1.Panel2 // this.splitContainer1.Panel2.Controls.Add(this.axToolbarControl1); this.splitContainer1.Panel2.Controls.Add(this.statusStrip1); this.splitContainer1.Panel2.Controls.Add(this.axMapControl1); this.splitContainer1.Panel2.Controls.Add(this.axToolbarControl2); this.splitContainer1.Size = new System.Drawing.Size(942, 597); this.splitContainer1.SplitterDistance = 272; this.splitContainer1.TabIndex = 58; // // tabControl1 // this.tabControl1.Controls.Add(this.tabPage1); this.tabControl1.Controls.Add(this.tabPage2); this.tabControl1.Dock = System.Windows.Forms.DockStyle.Fill; this.tabControl1.Location = new System.Drawing.Point(0, 0); this.tabControl1.Name = "tabControl1"; this.tabControl1.SelectedIndex = 0; this.tabControl1.Size = new System.Drawing.Size(272, 597); this.tabControl1.TabIndex = 50; // 87 // tabPage1 // this.tabPage1.Controls.Add(this.axTOCControl); this.tabPage1.Location = new System.Drawing.Point(4, 22); this.tabPage1.Name = "tabPage1"; this.tabPage1.Padding = new System.Windows.Forms.Padding(3); this.tabPage1.Size = new System.Drawing.Size(264, 571); this.tabPage1.TabIndex = 0; this.tabPage1.Text = "Color"; this.tabPage1.UseVisualStyleBackColor = true; // // tabPage2 // this.tabPage2.Controls.Add(this.dataGridView1); this.tabPage2.Location = new System.Drawing.Point(4, 22); this.tabPage2.Name = "tabPage2"; this.tabPage2.Padding = new System.Windows.Forms.Padding(3); this.tabPage2.Size = new System.Drawing.Size(264, 571); this.tabPage2.TabIndex = 1; this.tabPage2.Text = "Data"; this.tabPage2.UseVisualStyleBackColor = true; // // dataGridView1 // this.dataGridView1.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize; this.dataGridView1.Dock = System.Windows.Forms.DockStyle.Fill; this.dataGridView1.Location = new System.Drawing.Point(3, 3); this.dataGridView1.Name = "dataGridView1"; this.dataGridView1.Size = new System.Drawing.Size(258, 565); this.dataGridView1.TabIndex = 0; // // axToolbarControl1 // this.axToolbarControl1.Dock = System.Windows.Forms.DockStyle.Bottom; this.axToolbarControl1.Location = new System.Drawing.Point(0, 547); this.axToolbarControl1.Name = "axToolbarControl1"; this.axToolbarControl1.OcxState = ((System.Windows.Forms.AxHost.State)(resources.GetObject("axToolbarControl1. OcxState"))); this.axToolbarControl1.Size = new System.Drawing.Size(666, 28); this.axToolbarControl1.TabIndex = 59; // 88 // statusStrip1 // this.statusStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { this.toolStripStatusLabel1}); this.statusStrip1.Location = new System.Drawing.Point(0, 575); this.statusStrip1.Name = "statusStrip1"; this.statusStrip1.Size = new System.Drawing.Size(666, 22); this.statusStrip1.TabIndex = 60; this.statusStrip1.Text = "statusStrip1"; // // toolStripStatusLabel1 // this.toolStripStatusLabel1.Name = "toolStripStatusLabel1"; this.toolStripStatusLabel1.Size = new System.Drawing.Size(394, 17); this.toolStripStatusLabel1.Text = "Nguyễn Thị Huế - Trường Đại học Cơng nghệ - Đại học Quốc gia Hà Nội"; // // axToolbarControl2 // this.axToolbarControl2.Dock = System.Windows.Forms.DockStyle.Top; this.axToolbarControl2.Location = new System.Drawing.Point(0, 0); this.axToolbarControl2.Name = "axToolbarControl2"; this.axToolbarControl2.OcxState= ((System.Windows.Forms.AxHost.State)(resources.GetObject("axToolbarControl2. OcxState"))); this.axToolbarControl2.Size = new System.Drawing.Size(666, 28); this.axToolbarControl2.TabIndex = 61; // // label2 // this.label2.AutoSize = true; this.label2.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); this.label2.Location = new System.Drawing.Point(591, 9); this.label2.Name = "label2"; this.label2.Size = new System.Drawing.Size(59, 16); this.label2.TabIndex = 53; this.label2.Text = "Epxilon"; // // label1 // this.label1.AutoSize = true; 89 this.label1.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); this.label1.Location = new System.Drawing.Point(419, 8); this.label1.Name = "label1"; this.label1.Size = new System.Drawing.Size(53, 16); this.label1.TabIndex = 53; this.label1.Text = "Minpts"; // // Form1 // this.AutoScaleBaseSize = new System.Drawing.Size(5, 13); this.ClientSize = new System.Drawing.Size(948, 635); this.Controls.Add(this.panel1); this.Name = "Form1"; this.ShowIcon = false; this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; this.Text = "Phân cụm dữ liệu bằng thuật tốn DBScan"; this.Load += new System.EventHandler(this.Form1_Load); this.Closing += new System.ComponentModel.CancelEventHandler(this.Form1_Closing); ((System.ComponentModel.ISupportInitialize)(this.axMapControl1)).EndInit(); ((System.ComponentModel.ISupportInitialize)(this.axTOCControl)).EndInit(); ((System.ComponentModel.ISupportInitialize)(this.axLicenseControl1)).EndInit(); this.panel1.ResumeLayout(false); this.panel1.PerformLayout(); this.splitContainer1.Panel1.ResumeLayout(false); this.splitContainer1.Panel2.ResumeLayout(false); this.splitContainer1.Panel2.PerformLayout(); this.splitContainer1.ResumeLayout(false); this.tabControl1.ResumeLayout(false); this.tabPage1.ResumeLayout(false); this.tabPage2.ResumeLayout(false); ((System.ComponentModel.ISupportInitialize)(this.dataGridView1)).EndInit(); ((System.ComponentModel.ISupportInitialize)(this.axToolbarControl1)).EndInit(); this.statusStrip1.ResumeLayout(false); this.statusStrip1.PerformLayout(); ((System.ComponentModel.ISupportInitialize)(this.axToolbarControl2)).EndInit(); this.ResumeLayout(false); } #endregion [STAThread] static void Main() 90 { Application.Run(new Form1()); } private IRgbColor GetRGBColor(int yourRed, int yourGreen, int yourBlue) { IRgbColor pRGB=new RgbColorClass(); pRGB.Red = yourRed; pRGB.Green = yourGreen; pRGB.Blue = yourBlue; pRGB.UseWindowsDithering = true; return pRGB; } /// /// Checkout the Licence of ArcEngine /// /// public bool CheckLicence() { m_AoInitialize = new AoInitializeClass(); //Determine if the product is available esriLicenseStatus licenseStatus = (esriLicenseStatus)m_AoInitialize.IsProductCodeAvailable(esriLicenseProductCod e.esriLicenseProductCodeEngine); if (licenseStatus == esriLicenseStatus.esriLicenseAvailable) { licenseStatus = (esriLicenseStatus)m_AoInitialize.Initialize(esriLicenseProductCode.esriLicensePr oductCodeEngine); if (licenseStatus != esriLicenseStatus.esriLicenseCheckedOut) { MessageBox.Show("License của ArcEngine khơng hợp lệ nên chương trình này khơng thể chạy được!","Thơng báo", MessageBoxButtons.OK,MessageBoxIcon.Exclamation); return false; } return true; } else { return true; } 91 } public void ShutDownESRI() { AOUninitialize.Shutdown(); m_AoInitialize.Shutdown(); } private void Form1_Load(object sender, System.EventArgs e) { if(CheckLicence()) { idx = 0; fPath = Application.StartupPath + "\\SDE_Blank.mdb"; OpenMDBFile(fPath); Load_Combobox(); conn = new OleDbConnection(Constr); } } private void Form1_Closing(object sender, System.ComponentModel.CancelEventArgs e) { ShutDownESRI(); } #region Arcgis, Database MDB private void Load_Combobox() { //Lớp cboLayer.Items.Add("Tỉnh"); cboLayer.Items.Add("Huyện"); cboLayer.Items.Add("Xã"); cboLayer.SelectedIndex = 0; //Tiêu chí phân cụm cboField.Items.Add("Diện tích"); cboField.Items.Add("Chu vi"); cboField.SelectedIndex = 0; } IWorkspaceFactory workspaceFactory; IFeatureWorkspace pFeatureWorkspace; private void OpenMDBFile(string filemdb) { //Mở MDB file workspaceFactory = new ESRI.ArcGIS.DataSourcesGDB.AccessWorkspaceFactoryClass(); 92 pFeatureWorkspace = (IFeatureWorkspace)workspaceFactory.OpenFromFile(filemdb, 0); return; } private void AddLayer(string tblName, string dispName, string clmName) { //Thêm lớp IFeatureClass pFeatureClass = pFeatureWorkspace.OpenFeatureClass(tblName); IFeatureLayer pFeaturelayer = new FeatureLayerClass(); m_pGeoFeatureLayer =(IGeoFeatureLayer) pFeaturelayer; pFeaturelayer.FeatureClass = pFeatureClass; pFeaturelayer.Name = dispName;// pFeatureClass.AliasName; To_Mau(clmName); axMapControl1.AddLayer((ILayer)pFeaturelayer, 0); axMapControl1.Refresh(); return ; } public void ClearLayer() { axMapControl1.ClearLayers(); axMapControl1.Refresh(); } int idx; string fPath = null; string fTableName = null; string fFieldName = null; String Constr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + Application.StartupPath + "\\SDE_Blank.mdb"; OleDbConnection conn; OleDbCommand comm; private void To_Mau(string sfieldname) { string fieldname = sfieldname; IUniqueValueRenderer pUniqueValueRenderer; IFillSymbol pSym; IColor pColor; IColor pNextUniqueColor; IEnumColors pEnumRamp; ITable pTable; int fieldNumber; IRow pNextRow; IRowBuffer pNextRowBuffer; 93 ICursor pCursor; IQueryFilter pQueryFilter; object codeValue; pUniqueValueRenderer = new UniqueValueRendererClass(); pTable = (ITable)m_pGeoFeatureLayer; fieldNumber = pTable.FindField(fieldname); if (fieldNumber == -1) MessageBox.Show("Can't find field called " + fieldname); pUniqueValueRenderer.FieldCount = 1; pUniqueValueRenderer.set_Field(0, fieldname); IRandomColorRamp pColorRamp = new RandomColorRampClass(); pColorRamp.StartHue = 0; pColorRamp.MinValue = 99; pColorRamp.MinSaturation = 15; pColorRamp.EndHue = 360; pColorRamp.MaxValue = 100; pColorRamp.MaxSaturation = 30; pColorRamp.Size = 100; bool t = true; pColorRamp.CreateRamp(out t); pEnumRamp = pColorRamp.Colors; pNextUniqueColor = null; pQueryFilter = new QueryFilterClass(); pQueryFilter.AddField(fieldname); pCursor = pTable.Search(pQueryFilter, true); pNextRow = pCursor.NextRow(); while (pNextRow != null) { pNextRowBuffer = pNextRow; codeValue = pNextRowBuffer.get_Value(pNextRowBuffer.Fields.FindField(fieldname)); pNextUniqueColor = pEnumRamp.Next(); if (pNextUniqueColor == null) { pEnumRamp.Reset(); pNextUniqueColor = pEnumRamp.Next(); } pSym = new SimpleFillSymbol(); pSym.Color = pNextUniqueColor; pUniqueValueRenderer.AddValue(codeValue.ToString(), fieldname, (ISymbol)pSym); pNextRow = pCursor.NextRow(); } 94 pSym = new SimpleFillSymbol(); pSym.Color = pEnumRamp.Next(); pUniqueValueRenderer.DefaultSymbol = (ISymbol)pSym; m_pGeoFeatureLayer.Renderer = (IFeatureRenderer)pUniqueValueRenderer; axMapControl1.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGeograph y, null, null); return; } private void Update_DB() { clsData _dbscanData = new clsData(Application.StartupPath + @"\SDE_Blank.mdb"); DataSet ds = new DataSet(); ds = _dbscanData.Get_Data(fTableName, fFieldName); DBScanProject.clsDBScan _dbscanProject = new DBScanProject.clsDBScan(ds); int _min = 0; double _epx = 0; try { _min = Convert.ToInt16(txt_Minpt.Text); _epx = Convert.ToDouble(txt_Epxilon.Text); } catch { } _dbscanProject.DBCluster(_min,_epx); _dbscanProject.Get_Result(); ds = _dbscanProject.Get_Dataset(ds); _dbscanData.Set_Cluster(ds, fTableName); try { dataGridView1.DataSource = _dbscanData.LoadDB_Cluster(fTableName).Tables[0]; } catch { dataGridView1.DataSource = null; } } #endregion private void OK_Click(object sender, EventArgs e) { this.axMapControl1.ClearLayers(); 95 dataGridView1.DataSource = null; switch (cboLayer.SelectedIndex) { case 0: { fTableName = "RGTINH"; break; } case 1: { fTableName = "RGHUYEN"; break; } case 2: { fTableName = "RGXA"; break; } } switch (cboField.SelectedIndex) { case 0: { fFieldName = "SHAPE_Area"; break; } case 1: { fFieldName = "SHAPE_Length"; break; } } Update_DB(); idx++; AddLayer(fTableName, "Lớp " + idx.ToString(), "cluster"); } } }

Các file đính kèm theo tài liệu này:

  • pdfLUẬN VĂN- NGHIÊN CỨU CÁC KỸ THUẬT PHÂN CỤM DỮ LIỆU VÀ ỨNG DỤNG.pdf