Để 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.
101 trang |
Chia sẻ: lylyngoc | Lượt xem: 2621 | Lượt tải: 1
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:
- LUẬN VĂN- NGHIÊN CỨU CÁC KỸ THUẬT PHÂN CỤM DỮ LIỆU VÀ ỨNG DỤNG.pdf