Download as pdf or txt
Download as pdf or txt
You are on page 1of 21

Phöông phaùp gom cuïm (clustering)

Baøi giaûng moân hoïc “Khai phaù döõ lieäu treân CSDL quan heä”
GV. Nguyeãn Duy Nhaát
Muïc luïc :
1. Daãn nhaäp.......................................................................................................... 1
2. Phöông phaùp .................................................................................................... 2
3. Giaûi thuaät ....................................................................................................... 21
Noäi dung giaûi thuaät
Ví duï minh hoïa
4. Caøi ñaët & Thöû nghieäm vôùi CSharp .............................................................. 22

1. Daãn nhaäp
Xeùt baûng goàm 20 boä soá lieäu ( X, Y ) :

X Y
48 229
61 196
67 216
96 187
99 163
127 156
132 130
171 112
247 100
253 153
258 67
273 109
297 103
299 67
300 132
325 153
327 136
354 156
366 184
403 201

Ñoà thò ôû hình sau cho ta hình dung veà söï phaân boá cuûa döõ lieäu

1
250

200

150

Boä soá lieäu


Y

100

50

0
0 100 200 300 400 500
X

Phöông phaùp hoài quy tuyeán tính trong tröôøng hôïp naøy seõ khoâng cho ta keát quaû toát.
Tuy nhieân, neáu baèng moät caùch thöùc naøo ñoù, ta chia ñöôïc baûng soá lieäu ban ñaàu thaønh
hai baûng con :

X Y
48 229
61 196
67 216
96 187
99 163
127 156
132 130
171 112

vaø

X Y
247 100
253 153
258 67
273 109
297 103
299 67
300 132
325 153
327 136
354 156
366 184
403 201
2
, thì khi ñoù, aùp duïng phöông phaùp hoài quy cho töøng baûng con seõ cho keát quaû toát hôn
nhieàu. Ñoà thò ôû hình sau cho ta hình dung veà söï phaân boá döõ lieäu cuûa hai baûng con,
maø sau naøy ta seõ goïi laø hai cuïm, :

250

200

150
Cuïm 1
Y

Cuïm 2
100

50

0
0 100 200 300 400 500

Phöông phaùp gom cuïm ñöôïc trình baøy trong phaàn tieáp theo seõ cho ta moät soá caùch
thöùc ñeå thöïc hieän ñieàu naøy.

2. Phöông phaùp gom cuïm


... phaàn naøy chöa laøm... chæ laø ñeå noùi veà yù nghóa, yù töôûng vaø öu khuyeát ñieåm cuûa caùc
phöông phaùp gom cuïm.

3. Giaûi thuaät
3.1 Phöông phaùp phaân hoaïch
Input :
- A laø baûng goàm N boä soá lieäu n thuoäc tính : ( X1 , X 2 ,..., X n )
- k laø soá cuïm muoán phaân hoaïch
- Haøm ñoä ño d ( x, y ) : traû veà ñoä ño tính töông töï giöõa hai boä soá lieäu x vaø y.
Output :
- C1 ,...,Ck laø k cuïm ñaõ ñöôïc phaân hoaïch, nghóa laø
C1 ∪ C2 ∪ ... ∪ Ck = A , vaø
Ci ∩ C j = ∅ , ∀i, j = 1,..., k , i ≠ j .
Caùc böôùc thöïc hieän :
B1 : Choïn ít nhaát k ñieåm baát kyø trong A laøm phaàn töû (ñieåm) khôûi ñaàu cho k cuïm
(khôûi ñaàu, moãi cuïm coù ít nhaát moät ñieåm).

3
B2 : Tính troïng taâm cho moãi cuïm. Vôùi moãi cuïm Ci , i = 1, 2,..., k , thöïc hieän tính
( )
troïng taâm TBCi = X 1 , X 2 ,..., X n , trong ñoù X j laø trung bình cuûa caùc giaù trò taïi thuoäc
tính X j cuûa caùc phaàn töû trong cuïm Ci . Nghóa laø neáu ta kyù hieäu Ni laø soá phaàn töû
cuûa cuïm Ci , Ci [ t ] laø phaàn töû thöù t trong cuïm Ci , Ci [ t ] .X j laø giaù trò taïi thuoäc tính
X j cuûa phaàn töû Ci [ t ] , thì ta coù :
Ni

∑ C [ t ] .X
i j
Xj = t =1

Ni
B3 : Vôùi moãi phaàn töû (boä soá lieäu) x p trong baûng A, p = 1, 2,..., N , thöïc hieän phaân
(gom) x p vaøo cuïm gaàn nhaát, theo caùch :
3.1 Tìm giaù trò beù nhaát trong caùc giaù trò d ( x p , TBCi ) , vôùi i = 1, 2,..., k . Goïi
imin laø chæ soá cuûa giaù trò beù nhaát.
3.2 Phaân x p vaøo cuïm imin.
B4 : Neáu moät trong caùc böôùc 3.2 (ñaõ thöïc hieän) laøm thay ñoåi söï phaân cuïm cuûa x p ,
nghóa laø hoaëc tröôùc ñoù x p chöa töøng ñöôïc phaân cuïm hoaëc cuïm cuõ cuûa x p khaùc vôùi
cuïm môùi, thì quay trôû laïi böôùc B2.

Nhaän xeùt :
(i) Phöông phaùp phaân hoaïch ñoøi hoûi phaûi döï ñoaùn tröôùc soá cuïm k caàn phaân.
Ñieàu naøy, trong thöïc teá, khoâng phaûi luùc naøo cuõng coù theå deã thöïc hieän.
(ii) Söï thaønh coâng cuûa phöông phaùp phaân hoaïch, trong moät soá tröôøng hôïp ñaëc
bieät, coù theå bò leä thuoäc vaøo vieäc choïn ñieåm khôûi ñaàu cho moãi cuïm.
(iii) Phöông phaùp caàn ñöôïc caûi tieán ñeå khaéc phuïc moät soá thao taùc thöøa trong
töøng tình huoáng cuï theå.
(iv) Söï thaønh coâng cuûa phöông phaùp coøn phuï thuoäc vaøo caùch thöùc ñònh nghóa
taâm (cuûa cuïm), vaø haøm ñoä ño tính töông töï (xem muïc 4.2).

Ví duï minh hoïa :


Cho A laø baûng soá lieäu ôû muïc 1, soá cuïm caàn phaân k = 2 , haøm ñoä ño laø khoaûng caùch
euclide, nghóa laø, vôùi x = ( X1 , X 2 ,..., X n ) , y = ( Y1 , Y2 ,..., Yn ) ,
2 2 2
d ( x, y ) = ( X1 − Y1 ) + ( X 2 − Y2 ) + ... + ( X n − Yn )

B1 : Choïn ngaãu nhieân ñieåm ( 67, 216) cho cuïm 1 vaø (127,156) cho cuïm 2 :

Thuoäc Khoaûng caùch Khoaûng caùch


STT X Y
cuïm ñeán cuïm 2 ñeán cuïm 1
1 48 229
2 61 196
3 67 216 1

4
4 96 187
5 99 163
6 127 156 2
7 132 130
8 171 112
9 247 100
10 253 153
11 258 67
12 273 109
13 297 103
14 299 67
15 300 132
16 325 153
17 327 136
18 354 156
19 366 184
20 403 201

B2 : Do chæ coù moät ñieåm, neân taâm cuûa moãi cuïm cuõng chính laø ñieåm thuoäc cuïm :
TBC1 = ( 67, 216) , TBC2 = (127,156) .
B3 : Tính khoaûng caùch töø moïi ñieåm ñeán moãi cuïm, vaø thöïc hieän phaân ñieåm vaøo cuïm
gaàn nhaát, ta coù baûng keát quaû sau

Khoaûng caùch Khoaûng caùch Cuïm gaàn


Thuoäc
STT X Y ñeán cuïm 1 ñeán cuïm 2 nhaát ñöôïc
cuïm
Taâm=(67,216) Taâm=(127,156) phaân
1 48 229 23.02173 107.5639 1
2 61 196 20.88061 77.17513 1
3 67 216 1 0 84.85281 1
4 96 187 41.01219 43.84062 1
5 99 163 61.91123 28.86174 2
6 127 156 2 84.85281 0 2
7 132 130 107.8007 26.4764 2
8 171 112 147.0782 62.2254 2
9 247 100 214.1401 132.4236 2
10 253 153 196.3797 126.0357 2
11 258 67 242.2437 158.373 2
12 273 109 232.1314 153.3786 2
13 297 103 256.2596 178.0702 2
14 299 67 275.7263 193.6621 2
15 300 132 247.6792 174.6568 2
16 325 153 265.5805 198.0227 2

5
17 327 136 272.0294 200.9975 2
18 354 156 293.2047 227 2
19 366 184 300.7075 240.6346 2
20 403 201 336.3347 279.6444 2

B4 : Do coù söï thay ñoåi ôû baûng treân (giöõa coät “Thuoäc cuïm” vaø coät “Cuïm gaàn nhaát
ñöôïc phaân”), neân ta quay trôû laïi thöïc hieän böôùc B2.
B2 : TBC1 = ( 68,207 ) , TBC2 = ( 264.4375,132.625) .
B3 : Baûng keát quaû sau khi tính

Khoaûng caùch Khoaûng caùch Cuïm gaàn


Thuoäc
STT X Y ñeán cuïm 1 ñeán cuïm 2 nhaát ñöôïc
cuïm
Taâm=(67,216) Taâm=(127,156) phaân
1 48 229 1 29.73214 236.9247 1
2 61 196 1 13.0384 213.0803 1
3 67 216 1 9.055385 214.3198 1
4 96 187 1 34.4093 176.9967 1
5 99 163 2 53.82379 168.2029 1
6 127 156 2 77.98718 139.4111 1
7 132 130 2 100.1249 132.4635 1
8 171 112 2 140.1214 95.68677 2
9 247 100 2 208.5426 36.99266 2
10 253 153 2 192.72 23.36572 2
11 258 67 2 236.0085 65.93999 2
12 273 109 2 227.2202 25.12881 2
13 297 103 2 251.5094 44.02223 2
14 299 67 2 270.1129 74.17012 2
15 300 132 2 243.8217 35.56799 2
16 325 153 2 262.6119 63.89802 2
17 327 136 2 268.5554 62.65347 2
18 354 156 2 290.5116 92.56258 2
19 366 184 2 298.8863 113.8171 2
20 403 201 2 335.0537 154.5144 2

B4 : Cuõng do coù söï thay ñoåi ôû baûng treân (giöõa coät “Thuoäc cuïm” vaø coät “Cuïm gaàn
nhaát ñöôïc phaân”), neân ta quay trôû laïi thöïc hieän böôùc B2.
B2 : TBC1 = ( 90,182.4286) , TBC2 = ( 297.9231,128.6923) .
B3 : Baûng keát quaû sau khi tính

Khoaûng caùch Khoaûng caùch Cuïm gaàn


Thuoäc
STT X Y ñeán cuïm 1 ñeán cuïm 2 nhaát ñöôïc
cuïm
Taâm=(67,216) Taâm=(127,156) phaân

6
1 48 229 1 62.71282 269.3013 1
2 61 196 1 32.01849 246.2983 1
3 67 216 1 40.69448 246.8767 1
4 96 187 1 7.543074 210.1731 1
5 99 163 1 21.4119 201.8599 1
6 127 156 1 45.46943 173.0908 1
7 132 130 1 67.17704 165.9282 1
8 171 112 2 107.3368 128.016 1
9 247 100 2 177.3231 58.45005 2
10 253 153 2 165.6353 51.07785 2
11 258 67 2 203.8327 73.48328 2
12 273 109 2 197.182 31.76392 2
13 297 103 2 221.7158 25.70888 2
14 299 67 2 238.7567 61.70171 2
15 300 132 2 215.97 3.905693 2
16 325 153 2 236.8355 36.38714 2
17 327 136 2 241.5049 29.98116 2
18 354 156 2 265.3196 62.37252 2
19 366 184 2 276.0045 87.71208 2
20 403 201 2 313.5505 127.5522 2

B4 : Do vaãn coù moät söï thay ñoåi ôû ñieåm thöù 8 (töø cuïm 2 ñöôïc phaân vaøo cuïm 1), neân
ta quay trôû laïi thöïc hieän böôùc B2.
B2 : TBC1 = (100.125,173.625) , TBC2 = ( 308.5,130.0833) .
B3 : Baûng keát quaû sau khi tính

Khoaûng caùch Khoaûng caùch Cuïm gaàn


Thuoäc
STT X Y ñeán cuïm 1 ñeán cuïm 2 nhaát ñöôïc
cuïm
Taâm=(67,216) Taâm=(127,156) phaân
1 48 229 1 76.04871 278.6481 1
2 61 196 1 45.07112 256.1274 1
3 67 216 1 53.78574 256.3278 1
4 96 187 1 13.99665 219.9904 1
5 99 163 1 10.68439 212.0702 1
6 127 156 1 32.13886 183.341 1
7 132 130 1 54.02922 176.5 1
8 171 112 1 93.91968 138.684 1
9 247 100 2 164.2952 68.46354 2
10 253 153 2 154.26 60.04518 2
11 258 67 2 190.5083 80.80691 2
12 273 109 2 184.5594 41.2887 2
13 297 103 2 209.1594 29.42375 2

7
14 299 67 2 225.6549 63.79465 2
15 300 132 2 204.1633 8.713416 2
16 325 153 2 225.8189 28.23869 2
17 327 136 2 229.9737 19.4231 2
18 354 156 2 254.4861 52.36338 2
19 366 184 2 276.0045 87.71208 2
20 403 201 2 313.5505 127.5522 2

B4 : Do khoâng coøn söï thay ñoåi neân giaûi thuaät keát thuùc, vaø ta coù keát quaû laø hai cuïm
vôùi söï phaân boá nhö trong ñoà thò ôû muïc 1.

Giaûi thuaät caûi tieán cho phöông phaùp phaân hoaïch


...phaàn naøy chöa laøm...
3.2 Phöông phaùp phaân lôùp
...phaàn naøy chöa laøm...
3.3 Ñaùnh giaù phöông phaùp
...phaàn naøy chöa laøm...

4. Caøi ñaët vaø thöû nghieäm vôùi CSharp


4.1 Caøi ñaët
Muïc tieâu cuûa chöông trình seõ caøi ñaët : cho pheùp xöû lyù baûng döõ lieäu caàn gom cuïm töø
file excel, ñoàng thôøi veõ ñoà thò minh hoïa caùc cuïm sau khi gom. Ñeå ñôn giaûn, ta chæ
xöû lyù baûng döõ lieäu goàm 2 thuoäc tính (n=2), vaø caøi ñaët chöông trình theo giaûi thuaät
gom cuïm chöa caûi tieán.

B1 : Taïo project vaø thieát keá form coù daïng

OÂ textbox (teân maëc ñònh laø textBox1) ñeå khi chaïy chöông trình, ta nhaäp teân vaø
ñöôøng daãn cuûa file excel chöùa döõ lieäu. Checkbox beân döôùi (teân maëc ñònh laø
checkBox1) cho pheùp ngöng chöông trình sau moãi voøng laëp ñeå ta deã kieåm tra söï
thay ñoåi cuûa caùc cuïm.

8
B2 : Theâm boä thö vieän caùc haøm laäp trình excel vaøo project : Choïn menu Project
--> Add Reference --> choïn theû COM --> choïn muïc Microsoft Excel 11.0 Object
Library --> OK.

B3 : Chuaån bò file excel ñeå thöû nghieäm. Trong ví duï naøy, ta ñaët teân file laø
clustering.xls vaø ñaët ôû thö muïc goác oå ñóa C. Döõ lieäu trong file excel phaûi thoûa qui
caùch : Toaøn boä döõ lieäu ñaët trong sheet ñaàu tieân; coät A vaø coät B, baét ñaàu töø doøng 1,
chöùa hai coät cuûa baûng döõ lieäu (soá doøng khoâng giôùi haïn); coät C cho bieát doøng döõ lieäu
öùng vôùi ñieåm naøo ñöôïc gaùn khôûi ñaàu cho cuïm naøo (soá cuïm vaø soá ñieåm khôûi ñaàu cho
moãi cuïm khoâng giôùi haïn, chæ soá cuïm baét ñaàu töø 1). Ví duï, ta thieát keá file excel coù
daïng

Trong thieát keá ôû treân, ôû coät C, ta ñaõ choïn doøng 3 laøm ñieåm khôûi ñaàu cho cuïm 1,
doøng 6 laøm ñieåm khôûi ñaàu cho cuïm 2 (nhö vaäy laø ta muoán phaân hoaïch laøm 2 cuïm,
vaø khôûi ñaàu moãi cuïm chæ coù 1 ñieåm).

B4 : Vieát maõ leänh cho haøm xöû lyù söï kieän click cuûa nuùt “Thöïc hieän”, vaø ñaây cuõng laø
maõ leänh cuûa toaøn boä chöông trình.

9
Vì raèng seõ coù khaù nhieàu coâng vieäc phaûi laøm, neân tröôùc tieân, ta phaûi toùm taét caùc yù
chính caàn phaûi thöïc hieän :
4.1. Ñoïc döõ lieäu töø file excel vaøo caùc bieán cuûa chöông trình.
4.2. Taïo sheet môùi, vaø thieát keá giao dieän cho sheet naøy ñeå chuaån bò chöùa döõ lieäu
Output.
4.3. Thöïc hieän giaûi thuaät gom cuïm.
4.4. Veõ ñoà thò caùc cuïm keát quaû.
Caùc bieán seõ ñöôïc söû duïng :
n : chöùa soá doøng coù trong baûng,
X, Y : laø hai maûng kieåu thöïc coù n phaàn töû, ( X [ i] , Y [ i]) chöùa döõ lieäu cuûa doøng
thöù i + 1 trong baûng (chuù yù raèng trong haàu heát caùc ngoân ngöõ laäp trình, chæ soá cuûa
caùc phaàn töû trong maûng baét ñaàu töø 0),
TVC : laø maûng kieåu nguyeân khoâng aâm coù n phaàn töû, TVC [ i] cho bieát ñieåm
thöù i thuoäc veà cuïm naøo, neáu TVC [ i] = 0 nghóa laø ñieåm thöù i naøy chöa ñöôïc phaân
cuïm,
k : chöùa soá cuïm,
TCX, TCY : laø hai maûng kieåu thöïc coù k phaàn töû, ( TCX [ j] , TCY [ j]) cho bieát
toïa ñoä taâm cuûa cuïm thöù j,
SDTC : laø maûng kieåu nguyeân coù k phaàn töû, SDTC [ j] cho bieát soá ñieåm coù
trong cuïm thöù j,
stop : bieán kieån bool, sau moãi laàn thöïc hieän giaûi thuaät töø B2 --> B4, bieán stop
seõ cho bieát coù phaûi quay trôû laïi thöïc hieän B2 hay khoâng (neáu khoâng nghóa laø giaûi
thuaät keát thuùc). Khi baét ñaàu voøng laëp xöû lyù B2, ta gaùn stop = true , neáu trong quaù
trình phaân cuïm cho caùc ñieåm, neáu coù söï thay ñoåi cuïm cuûa baát kyø ñieåm naøo, ta ñeàu
seõ gaùn cho stop = false .

Maõ leänh haøm :


// B4.1
// - Môû file excel
Microsoft.Office.Interop.Excel.Application UngDungExcel;
Microsoft.Office.Interop.Excel.Workbook wb;
Microsoft.Office.Interop.Excel.Worksheet s, ns;
UngDungExcel = new Microsoft.Office.Interop.Excel.Application();
UngDungExcel.Visible = true;
// - Teân & ñöôøng daãn file excel naèm trong textBox1
wb = UngDungExcel.Workbooks.Open(textBox1.Text, 0, false, 5, "", "", false,
Microsoft.Office.Interop.Excel.XlPlatform.xlWindows, "", true, false, 0, true,
false, false);
// - Cho bieán s troû ñeán sheet ñaàu tieân trong file excel (thöù töï caùc sheet baét ñaàu töø 1)
s = (Microsoft.Office.Interop.Excel.Worksheet)wb.Worksheets[1];
// - Ñeám soá doøng trong baûng döõ lieäu input ôû sheet s
int n = 1;
while (s.get_Range("A" + n.ToString(), "A" + n.ToString()).Value2 != null)
{ // laëp laïi vieäc taêng n cho ñeán khi oâ An laø oâ troáng (=null)
n++;
}
n -= 1;
// - Ñoïc döõ lieäu töø baûng vaøo caùc maûng X, Y, vaø TVC

10
double[] X = new double[n];
double[] Y = new double[n];
int[] TVC = new int[n];
int k = 0;
for (int i = 1; i <= n; i++)
{
X[i-1] = (double)s.get_Range("A" + i.ToString(), "A" + i.ToString()).Value2;
Y[i-1] = (double)s.get_Range("B" + i.ToString(), "B" + i.ToString()).Value2;
// neáu oâ Ci ñeå troáng, nghóa laø ñieåm naøy khoâng ñöôïc phaân laøm ñieåm khôûi ñaàu cho
// baát kyø cuïm naøo
if (s.get_Range("C" + i.ToString(), "C" + i.ToString()).Value2 == null)
{
TVC[i-1] = 0;
}
else // neáu ngöôïc laïi thì phaân ñieåm naøy vaøo cuïm coù chæ soá taïi oâ Ci
{
TVC[i-1] = int.Parse(s.get_Range("C" + i.ToString(), "C" +
i.ToString()).Value2.ToString());
if (k < TVC[i-1]) k = TVC[i-1]; // k laø chæ soá lôùn nhaát trong coät C => k laø soá cuïm
}// end if
}// end for
double[] TCX = new double[k];
double[] TCY = new double[k];
int[] SDTC = new int[k];
// B4.2 : Taïo sheet môùi
// - Taïo sheet môùi vaø cho bieán ns troû ñeán sheet naøy, sheet môùi seõ duøng ñeå chöùa caùc keát quaû tính toaùn
//cuõng nhö keát quaû cuoái cuøng.
ns =
(Microsoft.Office.Interop.Excel.Worksheet)wb.Worksheets.Add(System.Type.Miss
ing, wb.Worksheets[wb.Worksheets.Count], System.Type.Missing,
System.Type.Missing);
// - “Trang trí” cho sheet môùi
ns.get_Range("A1","A1").Value2 = "Số điểm là " + n.ToString() + ", số cụm là " + k;
ns.get_Range("A2", "A2").Value2 = "X";
ns.get_Range("B2", "B2").Value2 = "Y";
ns.get_Range("C2", "C2").Value2 = "Thuộc cụm";
int d;
//ghi baûng döõ lieäu input trôû ra sheet môùi, taïi hai coät A vaø B.
for (int i = 0; i < n; i++)
{
d = i+3;
ns.get_Range("A" + d.ToString(), "A" + d.ToString()).Value2 = X[i];
ns.get_Range("B" + d.ToString(), "B" + d.ToString()).Value2 = Y[i];
}
for (int i = 0; i < k; i++)
{
ns.get_Range(((char)((int)'D' + i * 2)).ToString() + "2", ((char)((int)'D' +
(i * 2 + 1))).ToString() + "2").Merge(Type.Missing);
ns.get_Range(((char)((int)'D' + i*2)).ToString() + "2", ((char)((int)'D' +
i*2)).ToString() + "2").Value2 = "TâmCụm" + (i+1).ToString();
ns.get_Range(((char)((int)'D' + i+k*2)).ToString() + "2", ((char)((int)'D' +
i+k*2)).ToString() + "2").Value2 = "KC đến C" + (i + 1).ToString();
}
// B4.3 : Thöïc hieän giaûi thuaät gom cuïm
bool stop = false;
int LanLap = 0; // bieán naøy ghi nhaän laïi soá laàn giaûi thuaät phaûi laëp laïi
while (stop==false)
{
stop = true; // - Neáu coù söï thay ñoåi trong vieäc phaân cuïm cho baát kyø ñieåm naøo, ta ñeàu seõ gaùn
laïi //cho stop=false ñeå phuø hôïp vôùi ñieàu kieän laëp cuûa voøng while
// - Tính laïi toïa ñoä taâm cuûa moãi cuïm, laø toïa ñoä trung bình cuûa caùc ñieåm thuoäc cuïm
for (int i = 0; i < k; i++)
{

11
TCX[i] = 0;
TCY[i] = 0;
SDTC[i] = 0; // maûng naøy cho bieát cuïm i coù bao nhieâu ñieåm
}
for (int i = 0; i < n; i++)
{
if (TVC[i] > 0)
{
SDTC[TVC[i] - 1] += 1;
TCX[TVC[i] - 1] += X[i];
TCY[TVC[i] - 1] += Y[i];
}
}
for (int i = 0; i < k; i++)
{
TCX[i] = TCX[i]/SDTC[i];
TCY[i] = TCY[i] / SDTC[i];
// ghi toïa ñoä taâm caùc cuïm ra file excel, baét ñaàu taïi doøng 3, coät D
ns.get_Range(((char)((int)'D' + i*2)).ToString() + "3", ((char)((int)'D'
+ i*2)).ToString() + "3").Value2 = TCX[i];
ns.get_Range(((char)((int)'D' + (i*2+1))).ToString() + "3",
((char)((int)'D' + (i*2+1))).ToString() + "3").Value2 = TCY[i];
}
// - Duyeät laïi qua moïi ñieåm, tìm xem ñieåm naøo gaàn cuïm naøo nhaát thì phaân laïi ñieåm vaøo cuïm ñoù
for (int i = 0; i < n; i++)
{
// giaû söû ñieåm i gaàn cuïm 1 nhaát
int tamcu = TVC[i]; // löu laïi taâm cuõ
TVC[i] = 1;
double min = Math.Sqrt((X[i] - TCX[0]) * (X[i] - TCX[0]) + (Y[i] - TCY[0]) *
(Y[i] - TCY[0]));
ns.get_Range(((char)((int)'D' + (k * 2))).ToString() + (3 + i).ToString(),
((char)((int)'D' + (k * 2))).ToString() + (3 + i).ToString()).Value2 = min;
// so saùnh vôùi caùc cuïm coøn laïi, neáu coù cuïm naøo gaàn hôn thì thay TVC[i] baèng cuïm ñoù
for (int j = 1; j < k; j++)
{
double tmp = Math.Sqrt((X[i] - TCX[j]) * (X[i] - TCX[j]) + (Y[i] - TCY[j])
* (Y[i] - TCY[j]));
ns.get_Range(((char)((int)'D' + (j + k * 2))).ToString() + (3 +
i).ToString(), ((char)((int)'D' + (j + k * 2))).ToString() + (3 +
i).ToString()).Value2 = tmp;
if (tmp < min)
{
min = tmp;
TVC[i] = j+1;
}
}
ns.get_Range("C" + (i + 3).ToString(), "C" + (i + 3).ToString()).Value2 =
TVC[i];
// neáu taâm môùi khaùc taâm cuõ thì gaùn stop = false ñeå laëp laïi giaûi thuaät laàn nöõa
if ((stop==true)&&(TVC[i] != tamcu)) stop = false;
}// keát thuùc cuûa voøng laëp for i
// - Kieåm tra löïa choïn ôû checkbox “Döøng laïi sau moãi böôùc laëp”
if ((checkBox1.Checked==true)&&(stop == false))
{
LanLap += 1;
MessageBox.Show("Thuật toán gom cụm chưa kết thúc, đây là lần lặp thứ " + LanLap.ToString());
}
};// Keát thuùc cuûa voøng while, ra khoûi voøng while naøy laø giaûi thuaät keát thuùc
// B4.4 : Xuaát keát quaû ra file excel vaø veõ ñoà thò caùc cuïm
// - Ghi toïa ñoä caùc ñieåm thuoäc cuïm ra file excel
int[] CS = new int[k]; // - CS[i] seõ laø chæ soá cuûa cuïm thöù i, CS[i] seõ taêng daàn töø 0 ñeán SDTC[i]
for (int c = 0; c < k; c++)
{

12
ns.get_Range(((char)((int)'D' + c * 2)).ToString() + "4", ((char)((int)'D' +
(c * 2 + 1))).ToString() + "4").Merge(Type.Missing);
ns.get_Range(((char)((int)'D' + c * 2)).ToString() + "4", ((char)((int)'D' +
c * 2)).ToString() + "4").Value2 = "Điểm thuộc cụm";
CS[c] = 0;
}
// duyeät qua töøng ñieåm, xem ñieåm naøy thuoäc cuïm naøo thì ghi ra file excel ôû coät töông öùng
for (int c = 0; c < n; c++)
{
if (TVC[c] > 0)
{
ns.get_Range(((char)((int)'D' + (TVC[c] - 1) * 2)).ToString() + (5 +
CS[TVC[c] - 1]).ToString(), ((char)((int)'D' + (TVC[c] - 1) * 2)).ToString() + (5
+ CS[TVC[c] - 1]).ToString()).Value2 = X[c];
ns.get_Range(((char)((int)'D' + (TVC[c] - 1) * 2+1)).ToString() + (5 +
CS[TVC[c] - 1]).ToString(), ((char)((int)'D' + (TVC[c] - 1) * 2+1)).ToString() +
(5 + CS[TVC[c] - 1]).ToString()).Value2 = Y[c];
CS[TVC[c]-1] += 1;
}
}
// - Veõ ñoà thò caùc cuïm
Microsoft.Office.Interop.Excel.ChartObjects co =
(Microsoft.Office.Interop.Excel.ChartObjects)ns.ChartObjects(Type.Missing);
Microsoft.Office.Interop.Excel.ChartObject tt =
(Microsoft.Office.Interop.Excel.ChartObject)co.Add(400, 0, 450, 300);
tt.Chart.ChartType = Microsoft.Office.Interop.Excel.XlChartType.xlXYScatter;
Microsoft.Office.Interop.Excel.SeriesCollection sr;
// ta seõ veõ hai ñoâ thò, ñoà thò thöù nhaát laø hoãn hôïp cuûa caùc cuïm (moãi cuïm seõ laø moät maøu khaùc nhau)
//ñoà thò thöù hai laø ñoà thò cuûa baûng döõ lieäu input ban ñaàu
// Tröôùc tieân veõ ñoà thò thöù nhaát
sr =
(Microsoft.Office.Interop.Excel.SeriesCollection)tt.Chart.SeriesCollection(T
ype.Missing);
Microsoft.Office.Interop.Excel.Series x;
for (int c = 0; c < k; c++)
{
x = sr.NewSeries();// moãi moät series laø moät cuïm
// cung caáp toïa ñoä caùc ñieåm thuoäc cuïm cho caùc boä döõ lieäu X vaø Y cuûa series
x.XValues = ns.get_Range(((char)((int)'D' + c * 2)).ToString() + "5",
((char)((int)'D' + c * 2)).ToString() + (4 + CS[c]).ToString());
x.Values = ns.get_Range(((char)((int)'D' + c * 2+1)).ToString() + "5",
((char)((int)'D' + c * 2+1)).ToString() + (4+CS[c]).ToString());
}
// Veõ ñoà thò thöù hai
tt = (Microsoft.Office.Interop.Excel.ChartObject)co.Add(400, 300, 450, 300);
tt.Chart.ChartType = Microsoft.Office.Interop.Excel.XlChartType.xlXYScatter;
sr =
(Microsoft.Office.Interop.Excel.SeriesCollection)tt.Chart.SeriesCollection(T
ype.Missing);
x = sr.NewSeries();
x.XValues = ns.get_Range("A3", "A" + (n+2).ToString());
x.Values = ns.get_Range("B3", "B" + (n + 2).ToString());
MessageBox.Show("Thuật toán đã kết thúc, xem file excel để thấy kết quả .");

Ghi chuù : Ñoäc giaû copy toaøn boä noäi dung maõ leänh naøy vaøo haøm xöû lyù söï kieän click
cuûa nuùt thöïc hieän. Sau ñoù chaïy thöû chöông trình vôùi file excel ñaõ chuaån bò ôû B3, ta
seõ coù keát quaû gioáng nhö mong muoán ôû muïc 1.
4.2 Phöông phaùp gom cuïm vôùi ñoä ño phi Euclide
Ñaët vaán ñeà
Phöông phaùp gom cuïm ñaõ caøi ñaët ôû 4.1 khoâng thöïc söï cho keát quaû toát trong tröôøng
hôïp ta caàn phaân tích tính töông quan tuyeán tính treân caùc cuïm tìm ñöôïc. Thöïc vaäy,
13
sau khi chaïy thöû chöông trình vôùi file excel ñaõ chuaån bò ôû B3, ñöôøng hoài quy tìm
ñöôïc cho moãi cuïm trong tröôøng hôïp naøy coù daïng

Keát quaû seõ toát hôn neáu, baèng caùch naøo ñoù, ta gom baûng döõ lieäu ban ñaàu thaønh hai
cuïm coù daïng

khi ñoù, ñöôøng hoài quy seõ coù keát quaû toát hôn nhieàu :

14
Giaûi phaùp
Ta thieát keá laïi giaûi thuaät gom cuïm vôùi hai thay ñoåi veà caùch choïn taâm vaø haøm ñoä ño
tính töông töï (giöõa moät ñieåm vôùi taâm cuûa moät cuïm) :
(i) Taâm khoâng phaûi laø toïa ñoä trung bình cuûa caùc ñieåm thuoäc cuïm, maø laø
ñöôøng thaúng hoài quy xaáp xæ toát nhaát caùc ñieåm thuoäc cuïm. Do ñoù, khôûi ñaàu,
ta phaûi choïn cho moãi cuïm ít nhaát 2 ñieåm.
(ii) Haøm ñoä ño tính töông töï (khoaûng caùch) cuûa moät ñieåm so vôùi moät cuïm ñöôïc
tính baèng khoaûng caùch töø ñieåm ñoù ñeán ñöôøng thaúng hoài quy laø taâm cuûa
cuïm.
Chuù yù raèng : Goïi d : y = ax + b laø ñöôøng thaúng hoài quy, P ( xP , y P ) laø moät ñieåm baát
kyø naèm ngoaøi ñöôøng thaúng. Khi ñoù, khoaûng caùch töø P ñeán d ñöôïc cho bôûi coâng thöùc
: y P − ( a.x P + b ) ⋅ cos α , trong ñoù α laø goùc taïo bôûi ñöôøng thaúng vaø truïc hoaønh
(tröôøng hôïp ñöôøng thaúng hoài quy naèm thaúng ñöùng laø khoâng xaûy ra, do ñoù,
α ∈ ( − π 2, π 2) ). Do heä soá a chính laø heä soá goùc cuûa ñöôøng thaúng, töùc a = tan α , neân
α = arctan a .
Giaûi thuaät gom cuïm ñöôïc thieát keá laïi nhö sau :
Input :
- A laø baûng goàm N boä soá lieäu n thuoäc tính : ( X1 , X 2 ,..., X n )
- k laø soá cuïm muoán phaân hoaïch
- Haøm ñoä ño d ( x, y ) : traû veà ñoä ño tính töông töï giöõa hai boä soá lieäu x vaø y.
Output :
- C1 ,...,Ck laø k cuïm ñaõ ñöôïc phaân hoaïch, nghóa laø
C1 ∪ C2 ∪ ... ∪ Ck = A , vaø
Ci ∩ C j = ∅ , ∀i, j = 1,..., k , i ≠ j .
B1 : Choïn ít nhaát 2k ñieåm baát kyø trong A laøm phaàn töû (ñieåm) khôûi ñaàu cho k cuïm
(khôûi ñaàu, moãi cuïm coù ít nhaát hai phaàn töû).

15
B2 : Tìm phöông trình ñöôøng thaúng hoài quy cho moãi cuïm.
B3 : Vôùi moãi phaàn töû (boä soá lieäu) x p trong baûng A, p = 1, 2,..., N , thöïc hieän phaân
(gom) x p vaøo cuïm gaàn nhaát, theo caùch :
3.1 Tìm khoaûng caùch beù nhaát töø x p ñeán caùc ñöôøng thaúng hoài quy cuûa caùc
cuïm.
3.2 Phaân x p vaøo cuïm tìm ñöôïc ôû 3.1.
B4 : Neáu moät trong caùc böôùc 3.2 (ñaõ thöïc hieän) laøm thay ñoåi söï phaân cuïm cuûa x p ,
nghóa laø hoaëc tröôùc ñoù x p chöa töøng ñöôïc phaân cuïm hoaëc cuïm cuõ cuûa x p khaùc vôùi
cuïm môùi, thì quay trôû laïi böôùc B2.
Caøi ñaët : Töông töï nhö muïc 4.1, ta thay maõ leänh xöû lyù söï kieän click cuûa nuùt Thöïc
hieän baèng maõ leänh sau :
// B4.1
// - Môû file excel
Microsoft.Office.Interop.Excel.Application UngDungExcel;
Microsoft.Office.Interop.Excel.Workbook wb;
Microsoft.Office.Interop.Excel.Worksheet s, ns;
UngDungExcel = new Microsoft.Office.Interop.Excel.Application();
UngDungExcel.Visible = true;
// - Teân & ñöôøng daãn file excel naèm trong textBox1
wb = UngDungExcel.Workbooks.Open(textBox1.Text, 0, false, 5, "", "", false,
Microsoft.Office.Interop.Excel.XlPlatform.xlWindows, "", true, false, 0, true,
false, false);
// - Cho bieán s troû ñeán sheet ñaàu tieân trong file excel (thöù töï caùc sheet baét ñaàu töø 1)
s = (Microsoft.Office.Interop.Excel.Worksheet)wb.Worksheets[1];
// - Ñeám soá doøng trong baûng döõ lieäu input ôû sheet s
int n = 1;
while (s.get_Range("A" + n.ToString(), "A" + n.ToString()).Value2 != null)
{ // laëp laïi vieäc taêng n cho ñeán khi oâ An laø oâ troáng (=null)
n++;
}
n -= 1;
// - Ñoïc döõ lieäu töø baûng vaøo caùc maûng X, Y, vaø TVC
double[] X = new double[n];
double[] Y = new double[n];
int[] TVC = new int[n];
int k = 0;
for (int i = 1; i <= n; i++)
{
X[i-1] = (double)s.get_Range("A" + i.ToString(), "A" + i.ToString()).Value2;
Y[i-1] = (double)s.get_Range("B" + i.ToString(), "B" + i.ToString()).Value2;
// neáu oâ Ci ñeå troáng, nghóa laø ñieåm naøy khoâng ñöôïc phaân laøm ñieåm khôûi ñaàu cho
// baát kyø cuïm naøo
if (s.get_Range("C" + i.ToString(), "C" + i.ToString()).Value2 == null)
{
TVC[i-1] = 0;
}
else // neáu ngöôïc laïi thì phaân ñieåm naøy vaøo cuïm coù chæ soá taïi oâ Ci
{
TVC[i-1] = int.Parse(s.get_Range("C" + i.ToString(), "C" +
i.ToString()).Value2.ToString());
if (k < TVC[i-1]) k = TVC[i-1]; // k laø chæ soá lôùn nhaát trong coät C => k laø soá cuïm
}// end if
}// end for
double[] TCHSa = new double[k]; // TCHSa[i], TCHSb[i], laø heä soá a, heä soá b cuûa ñöôøng thaúng
double[] TCHSb = new double[k]; // hoài quy cuûa cuïm thöù i,

16
double[] TBx = new double[k]; // TBx[i], TBy[i], tuso[i], mauso[i] laø caùc bieán trung gian duøng ñeå
double[] TBy = new double[k]; //tính toaùn ñöôøng hoài quy cho cuïm thöù i theo coâng thöùc ôû muïc 1
double[] tuso = new double[k];
double[] mauso = new double[k];
int[] SDTC = new int[k];
// B4.2 : Taïo sheet môùi
// - Taïo sheet môùi vaø cho bieán ns troû ñeán sheet naøy, sheet môùi seõ duøng ñeå chöùa caùc keát quaû tính toaùn
//cuõng nhö keát quaû cuoái cuøng.
ns =
(Microsoft.Office.Interop.Excel.Worksheet)wb.Worksheets.Add(System.Type.Miss
ing, wb.Worksheets[wb.Worksheets.Count], System.Type.Missing,
System.Type.Missing);
// - “Trang trí” cho sheet môùi
ns.get_Range("A1","A1").Value2 = "Số điểm là " + n.ToString() + ", số cụm là " + k;
ns.get_Range("A2", "A2").Value2 = "X";
ns.get_Range("B2", "B2").Value2 = "Y";
ns.get_Range("C2", "C2").Value2 = "Thuộc cụm";
int d;
//ghi baûng döõ lieäu input trôû ra sheet môùi, taïi hai coät A vaø B.
for (int i = 0; i < n; i++)
{
d = i+3;
ns.get_Range("A" + d.ToString(), "A" + d.ToString()).Value2 = X[i];
ns.get_Range("B" + d.ToString(), "B" + d.ToString()).Value2 = Y[i];
}
for (int i = 0; i < k; i++)
{
ns.get_Range(((char)((int)'D' + i * 2)).ToString() + "2", ((char)((int)'D' +
(i * 2 + 1))).ToString() + "2").Merge(Type.Missing);
ns.get_Range(((char)((int)'D' + i*2)).ToString() + "2", ((char)((int)'D' +
i*2)).ToString() + "2").Value2 = "TâmCụm" + (i+1).ToString();
ns.get_Range(((char)((int)'D' + i+k*2)).ToString() + "2", ((char)((int)'D' +
i+k*2)).ToString() + "2").Value2 = "KC đến C" + (i + 1).ToString();
}
// B4.3 : Thöïc hieän giaûi thuaät gom cuïm
bool stop = false;
int LanLap = 0; // bieán naøy ghi nhaän laïi soá laàn giaûi thuaät phaûi laëp laïi
while (stop==false)
{
stop = true; // - Neáu coù söï thay ñoåi trong vieäc phaân cuïm cho baát kyø ñieåm naøo, ta ñeàu seõ gaùn
laïi //cho stop=false ñeå phuø hôïp vôùi ñieàu kieän laëp cuûa voøng while
// - Tìm ñöôøng thaúng hoài quy ñi qua moãi cuïm
for (int i = 0; i < k; i++)
{
SDTC[i] = 0;
TBx[i] = 0;
TBy[i] = 0;
tuso[i] = 0;
mauso[i] = 0;
TCHSa[i] = 0;
TCHSb[i] = 0;
}
for (int i = 0; i < n; i++)
{
if (TVC[i] > 0)
{
//ñeám soá ñieåm cuûa moãi cuïm vaø coäng doàn TBx, TBy ñeå chuaån bò tính trung bình
SDTC[TVC[i] - 1] += 1;
TBx[TVC[i] - 1] += X[i];
TBy[TVC[i] - 1] += Y[i];
}
}
for (int i = 0; i < k; i++)
17
{
if (SDTC[i]<2)
{
MessageBox.Show("Số điểm chọn cho mỗi cụm phải từ 2 trở lên)");
return;
}
TBx[i] = TBx[i]/SDTC[i];
TBy[i] = TBy[i] / SDTC[i];
}
// tính tieáp caùc tham soá trung gian khaùc theo coâng thöùc ôû muïc 1
for (int i = 0; i < n; i++)
{
if (TVC[i] > 0)
{
double xi, yi;
xi = X[i] - TBx[TVC[i]-1];
yi = Y[i] - TBy[TVC[i] - 1];
tuso[TVC[i] - 1] += (xi * yi);
mauso[TVC[i] - 1] += (xi * xi);
}
}
// cuoái cuøng, tính caùc heä soá a, b cuûa caùc ñöôøng hoài quy
for (int i = 0; i < k; i++)
{
TCHSa[i] = tuso[i] / mauso[i];
TCHSb[i] = TBy[i] - TCHSa[i] * TBx[i];
// xuaát caùc heä soá naøy ra file excel
ns.get_Range(((char)((int)'D' + i * 2)).ToString() + "3", ((char)((int)'D'
+ i * 2)).ToString() + "3").Value2 = TCHSa[i];
ns.get_Range(((char)((int)'D' + (i * 2 + 1))).ToString() + "3",
((char)((int)'D' + (i * 2 + 1))).ToString() + "3").Value2 = TCHSb[i];
}
// - Duyeät laïi qua moïi ñieåm, tìm xem ñieåm naøo gaàn cuïm naøo nhaát thì phaân laïi ñieåm vaøo cuïm ñoù
for (int i = 0; i < n; i++)
{
// giaû söû ñieåm i gaàn cuïm 1 nhaát
double tmp = Math.Abs(TCHSa[0]*X[i] + TCHSb[0] - Y[i]);
double alpha = Math.Atan(TCHSa[0]);
double min = Math.Cos(alpha)*tmp;
int tamcu = TVC[i]; // löu laïi taâm cuõ
TVC[i] = 1;
ns.get_Range(((char)((int)'D' + (k * 2))).ToString() + (3 + i).ToString(),
((char)((int)'D' + (k * 2))).ToString() + (3 + i).ToString()).Value2 = min;
// so saùnh vôùi caùc cuïm coøn laïi, neáu coù cuïm naøo gaàn hôn thì thay TVC[i] baèng cuïm ñoù
for (int j = 1; j < k; j++)
{
tmp = Math.Abs(TCHSa[j] * X[i] + TCHSb[j] - Y[i]);
alpha = Math.Atan(TCHSa[j]);
tmp = Math.Cos(alpha) * tmp;
ns.get_Range(((char)((int)'D' + (j + k * 2))).ToString() + (3 +
i).ToString(), ((char)((int)'D' + (j + k * 2))).ToString() + (3 +
i).ToString()).Value2 = tmp;
if (tmp < min)
{
min = tmp;
TVC[i] = j+1;
}
}
ns.get_Range("C" + (i + 3).ToString(), "C" + (i + 3).ToString()).Value2 =
TVC[i];
// neáu taâm môùi khaùc taâm cuõ thì gaùn stop = false ñeå laëp laïi giaûi thuaät laàn nöõa
if ((stop==true)&&(TVC[i] != tamcu)) stop = false;
}// keát thuùc cuûa voøng laëp for i
// - Kieåm tra löïa choïn ôû checkbox “Döøng laïi sau moãi böôùc laëp”
if ((checkBox1.Checked==true)&&(stop == false))

18
{
LanLap += 1;
MessageBox.Show("Thuật toán gom cụm chưa kết thúc, đây là lần lặp thứ " + LanLap.ToString());
}
};// Keát thuùc cuûa voøng while, ra khoûi voøng while naøy laø giaûi thuaät keát thuùc
// B4.4 : Xuaát keát quaû ra file excel vaø veõ ñoà thò caùc cuïm
// - Ghi toïa ñoä caùc ñieåm thuoäc cuïm ra file excel
int[] CS = new int[k]; // - CS[i] seõ laø chæ soá cuûa cuïm thöù i, CS[i] seõ taêng daàn töø 0 ñeán SDTC[i]
for (int c = 0; c < k; c++)
{
ns.get_Range(((char)((int)'D' + c * 2)).ToString() + "4", ((char)((int)'D' +
(c * 2 + 1))).ToString() + "4").Merge(Type.Missing);
ns.get_Range(((char)((int)'D' + c * 2)).ToString() + "4", ((char)((int)'D' +
c * 2)).ToString() + "4").Value2 = "Điểm thuộc cụm";
CS[c] = 0;
}
// duyeät qua töøng ñieåm, xem ñieåm naøy thuoäc cuïm naøo thì ghi ra file excel ôû coät töông öùng
for (int c = 0; c < n; c++)
{
if (TVC[c] > 0)
{
ns.get_Range(((char)((int)'D' + (TVC[c] - 1) * 2)).ToString() + (5 +
CS[TVC[c] - 1]).ToString(), ((char)((int)'D' + (TVC[c] - 1) * 2)).ToString() + (5
+ CS[TVC[c] - 1]).ToString()).Value2 = X[c];
ns.get_Range(((char)((int)'D' + (TVC[c] - 1) * 2+1)).ToString() + (5 +
CS[TVC[c] - 1]).ToString(), ((char)((int)'D' + (TVC[c] - 1) * 2+1)).ToString() +
(5 + CS[TVC[c] - 1]).ToString()).Value2 = Y[c];
CS[TVC[c]-1] += 1;
}
}
// - Veõ ñoà thò caùc cuïm
Microsoft.Office.Interop.Excel.ChartObjects co =
(Microsoft.Office.Interop.Excel.ChartObjects)ns.ChartObjects(Type.Missing);
Microsoft.Office.Interop.Excel.ChartObject tt =
(Microsoft.Office.Interop.Excel.ChartObject)co.Add(400, 0, 450, 300);
tt.Chart.ChartType = Microsoft.Office.Interop.Excel.XlChartType.xlXYScatter;
Microsoft.Office.Interop.Excel.SeriesCollection sr;
// ta seõ veõ hai ñoâ thò, ñoà thò thöù nhaát laø hoãn hôïp cuûa caùc cuïm (moãi cuïm seõ laø moät maøu khaùc nhau)
//ñoà thò thöù hai laø ñoà thò cuûa baûng döõ lieäu input ban ñaàu
// Tröôùc tieân veõ ñoà thò thöù nhaát
sr =
(Microsoft.Office.Interop.Excel.SeriesCollection)tt.Chart.SeriesCollection(T
ype.Missing);
Microsoft.Office.Interop.Excel.Series x;
for (int c = 0; c < k; c++)
{
x = sr.NewSeries();// moãi moät series laø moät cuïm
// cung caáp toïa ñoä caùc ñieåm thuoäc cuïm cho caùc boä döõ lieäu X vaø Y cuûa series
x.XValues = ns.get_Range(((char)((int)'D' + c * 2)).ToString() + "5",
((char)((int)'D' + c * 2)).ToString() + (4 + CS[c]).ToString());
x.Values = ns.get_Range(((char)((int)'D' + c * 2+1)).ToString() + "5",
((char)((int)'D' + c * 2+1)).ToString() + (4+CS[c]).ToString());
}
// Veõ ñoà thò thöù hai
tt = (Microsoft.Office.Interop.Excel.ChartObject)co.Add(400, 300, 450, 300);
tt.Chart.ChartType = Microsoft.Office.Interop.Excel.XlChartType.xlXYScatter;
sr =
(Microsoft.Office.Interop.Excel.SeriesCollection)tt.Chart.SeriesCollection(T
ype.Missing);
x = sr.NewSeries();
x.XValues = ns.get_Range("A3", "A" + (n+2).ToString());
x.Values = ns.get_Range("B3", "B" + (n + 2).ToString());
MessageBox.Show("Thuật toán đã kết thúc, xem file excel để thấy kết quả .");

19
Chaïy thöû chöông trình vôùi file excel ñaõ chuaån bò ôû böôùc B3, chuù yù raèng phaûi choïn
khôûi ñaàu cho moãi cuïm ít nhaát laø 2 ñieåm, ta seõ nhaän ñöôïc keát quaû nhö mong muoán
ñaõ ñaët ra.
4.3 Thöû nghieäm
...phaàn naøy chöa laøm...

20
Ñaët vaán ñeà cho ñoäc giaû :
1. Caøi ñaët phöông phaùp cho tröôøng hôïp baûng döõ lieäu coù 3, 4, hoaëc 5 thuoäc tính.
2. Söû duïng ñoä ño khaùc.
3. Boå sung vaøo phaàn phaân tích töông quan tuyeán tính giöõa caùc caëp loaïi haøng : vôùi
moãi caëp, thöû gom thaønh 2, 3 cuïm roài tính toaùn heä soá töông quan treân moãi cuïm.
4. Khaûo saùt saûn löôïng tieâu thuï cuûa loaïi haøng x theo töøng ngaøy trong naêm 1998.
a. Laäp baûng soá lieäu.
b. Söû duïng excel veõ ñoà thò ñeå xem söï phaân boá cuûa döõ lieäu.
c. Thöïc hieän gom cuïm vôùi k = 2, 3, 4.
d. Tính heä soá töông quan treân moãi cuïm
5. Laøm töông töï vôùi Khaùch haøng – Ñoä tuoåi
6. Ñaùnh giaù ñoä toát cuûa caùc cuïm
7. Gom cuïm khaùch haøng vôùi caùc thuoäc tính : ñoä tuoåi, (tình traïng gia ñình) thu nhaäp,
soá con, house owner, education

21

You might also like