Phân cụm tập đặc trưng

Một phần của tài liệu Nghiên cứu phương pháp nhận dạng chữ việt in chất lượng thấp (Trang 38 - 52)

Phân cụm là quá trình phân tách (partitioning) hoặc nhóm (grouping)

một tập mẫu (pattern) cho trước thành các cụm (cluster) riêng biệt. Việc phân

cụm hiện đã được ứng dụng trong rất nhiều lĩnh vực, chẳng hạn như trong

thống kê (statistic), khai phá dữ liệu (data mining), nhận dạng mẫu (pattern

recognition), mạng nơron(NN), trí tuệ nhân tạo[12].

Trong phần này, luận văn sẽ lựa chọn một thuật toán phân cụm tập đặc trưng theo hướng tiếp cận kiến trúc trong đó cấu trúc cây tìm kiếm nhị phân đa chiều K-D Tree được sử dụng để tăng tốc độ tìm kiếm các láng giềng gần

2.2.1.1 Cây K-D (cây K chiều)

Một cây K-D (K-D tree) là một cấu trúc dữ liệu để lưu trữ một tập hữu

hạn các điểm từ không gian k chiều (k- dimension). Cấu trúc này đãđược lựa

chọn và kiểm nghiệm bởi J.Bentley[10], với các tính chất cơ bản như sau:

 Là một cây tìm kiếm nhị phân đa chiều.

 Cho một tập N mẫu E = {E1, E2, …, EN}, trong đó mỗi mẫu Ei ∈

Domain × Range, với và là hai không gian đa

chiều. Nếu tập mẫu E được thể hiện bởi một cấu trúc cây K-D thì mỗi mẫu Ei trong đó phải được lưu trữ như một nút trên cây.

 Mỗi nút trên cây được thể hi ện bởi các trường thông tin cơ bản như sau: {domain_vector, range_vector, discriminator, left, right}, trong đó

domain_vector là một vector kd chiều; range_vector là một vector kr chiều;

discriminator là một số nguyên nằm trong khoảng từ 0 đến k-1; left, right lần lượt là các cây con bên trái và bên phải của nút.

 Domain_vector là thành phần chỉ số của nút. Nó chia một không gian

(space) thành hai không gian con theo một siêu phẳng phân tách (splitting

hyperplane) của nút. Tất cả các điểm trong không gian con “bên trái” được

thể hiện bởi cây con left. Tất cả các điểm trong không gian con “bên phải” được thể hiện bởi cây con right.

 Siêu phẳng phân tách là một mặt phẳng đi qua domain_vector và vuông góc với hướng được xác định bởi giá trị discriminator.

 Gọi i là một giá trị của trường discriminator, một điểm sẽ nằm ở bên trái của một domain_vector nếu và chỉ nếu thành phần thứ i của nó nhỏ hơn

thành phần thứ i của domain_vector. Tương tự, một điểm nằm ở bên phải của

phần thứ i của domain_vector. Nếu một nút không có con thì sẽ không cần đến siêu phẳng phân tách.

 Tất cả các nút trên cùng một mức (level) của cây sẽ có cùng giá trị

discriminator. Nút gốc có discriminator = 0, 2 con của nó có discriminator =

1, và như vậy các nút con ở mức thứ k của cây sẽ có discriminator = k-1. Các nút conở mức k+1 sẽ có discriminator = 0 và chu trìnhđược lặp lại.

Hình 2.4 thể hiện một cấu trúc cây K-D cho 7 điểm domain_vector:

A(40, 45), B(15, 70), C(70, 70), D(69, 50), E(55, 80), F(80, 90). Nút gốc với

domain_vector A(40, 50) sẽ tách mặt phẳng theo trục x thành 2 mặt phẳng con. Điểm B (15, 70) nằm ở mặt phẳng con bên trái, tức là {(x,y) | x < 40} và do vậy nó sẽ nằm ở cây con bên trái, trong khi đó điểm C(70, 10) nằm ở mặt (adsbygoogle = window.adsbygoogle || []).push({});

phẳng bên phải, thỏa mãn {(x,y) | x < 40} nên nó nằm ở cây con bên phải.

Lúc này do mặt phẳng con bên trái chỉ chứa duy nhất một điểm B nên không cần phân tách nữa. Ngược lại, mặt phẳng con bên phải chứa C và các điểm

còn lại nên tại nút tương ứng với domain_vector C(40, 45) sẽ tiếp tục tách

mặt phẳng con này theo trục y thành 2 mặt phẳng con. Mặt phẳng con phía dưới (lower) không chứa điểm nào, có nghĩa là không tồn tại bất kỳ điểm nào thỏa mãn {(x,y)| y < 45}. Điểm D(69, 50) nằm ở mặt phẳng con phía trên (upper), thỏa mãn {(x,y) | y > 45}, do vậy nó nằm ở cây con bên phải. Lúc

này tại nút tương ứng với domain_vector D(69, 50) tiếp tục tách mặt phẳng

con phía trên này theo trục x thành hai mặt phẳng c on. Điểm E(55, 80) nằm ở

mặt ở phẳng con bên trái, thỏa mãn {(x, y) | x < 69} nên nằm ở cây con bên

trái. Ngược lại, điểm F(80, 90) nằm ở mặt phẳng con bên phải, thỏa mãn {(x,

Hình 2.4: Một cấu trúc cây K-D 2.2.1.2 Các cấu trúc dữ liệu

Trong mô hình phân lớp ký tự được lựa chọn, việc phân cụm tập đặc trưng là một trong những thao tác cơ bản trong quá trình huấn luyện thuật toán. Đầu vào của bước xử lý này là tập các đặc trưng được trích chọn từ tập mẫu học (theo phương pháp trích chọn đặc trưng đã được đề cập ở phần

2.1.1). Bước xử lýcó nhiệm vụ phân cụm tập đặc trưng đầu vào để tạo ra các

cụm đặc trưng đại diện cho từng lớp kí tự. Mỗi cụm đặc trưng này được gọi là một mẫu (template) và sẽ được dùng để làm mẫu đối sánh trong thuật toán

phân lớp (đề cập cụ thể trongphần2.2). Mỗi đặc trưng thu được sau quá trình phân cụm được gọi là một đặc trưng đại diện.

Việc phân cụm ở đây sẽ được thực hiện lần lượt với từng lớp mẫu kí

tự trong tập dữ liệu học. Để thuận tiện cho quá trình truy xuất dữ liệu, tập đặc trưng được sử dụng để huấn luyện mỗi lớp kí tự được lưu trữ trong một

cấu trúc dữ liệu CHARLIST, với các trường dữ liệu được mô tả cụ thể trên Hình 2.5.

Thông tin mô tả của cấu trúc dữ liệu

Cấu trúc dữ liệu

Tên trường Kiểu trường Mô tả

FEATURE NumParams Params Interger Float Số lượng các tham số Mảng các tham số FEATURE_SET NumFeats Features Interger FEATURE* Số lượng các feature Mảng các FEATURE CHAR_LIST CharCode NumSamples FeatureSet_List Interger Interger LIST Mã của kí tự Số lượng mẫu Danh sách các FEATURE_SET

Hình 2.5: Cấu trúc dữliệu lưu các đặc trưng đầu vào

Cấu trúc dữ liệu FEATURE_SET thể hiện một tập các đặc trưng, trong đó NumFeats là số lượng đặc trưng trong tập và Features là một mảng chứa

NumFeats đặc trưng, trong đó mỗi đặc trưng được thể hiện bằng một cấu trúc

FEATURE. Cấu trúc CHAR_LIST với 3 thành phần dữ liệu {CharCode, NumSamples, FeatureSet_List} dùng để lưu trữ các tập đặc trưng được trích

chọn từ một tập gồm NumSamples mẫu tương ứng của lớp kí tự CharCode.

Mỗi tập đặc trưng tương ứng với một mẫu học sẽ được thể hiện bằng một cấu

trúc FEATURE_SET.

Quá trình phân cụm tập đặc trưng đầu vào có thể chia thành 3 bước cơ bản như sau:

• Tạo cây và lưu trữ dữ liệu vào cây K-D

• Tính các Prototype từ các cụm đặc trưng (adsbygoogle = window.adsbygoogle || []).push({});

Bước xử lý đầu tiên sẽ tiến hành tạo cấu trúc dữ liệu cây K-D, trong đó mỗi đặc trưng đầu vào sẽ tương ứng với một nút lá trên cây lưu trữ.

Trong thực tế, sau đó đọc ra các dữ liệu đã lưu trữ trong danh sách CHAR_LIST và lưu chúng vào cấu trúc cây vừa tạo. Trong đó, mỗi đặc trưng đầu vào sẽ được thể hiện bằng một nút trên cây. Cấu trúc cây K-D và mỗi nút

của nó được thể hiện chi tiết trên Hình 2.6.

Thông tin mô tả của cấu trúc dữ liệu

Cấu trúc

dữ liệu Tên trường Kiểu trường Mô tả

KDNode Keys Data BranchPoint LeftBranch RightBranch Left Right float* char* float float float KDNode* KDNode* Mảng các khóa tìm kiếm của nút

Con trỏ đến cấu trúc dữ liệu được lưu

Sử dụng cho việc xóa nút hiệu quả hơn

Sử dụng để tối ưu hóa việc tìm kiếm

Sử dụng để tối ưu hóa việc tìm kiếm

Con trỏ đến cây con bên trái Con trỏ đến cây con bên phải

KDTree DimSize Rood DimDesc Interger KDNode DIM_DES C

Số chiều của cây K-D

KDNode.Left trỏ đến nút gốc thực

sự

Mô tả về mỗi chiều

Cấu trúc KDNode với 7 trường thông tin {Keys, Data, BranchPoint,

LeftBranch, RightBranch, Left, Right} thể hiện một nút trên cây K-D. Key (trong không gian N chiều) là khóa của nút được sử dụng để phục vụ cho quá

trình tìm kiếm trên cây. Data là con trỏ đến cấu trúc dữ liệu được lưu vào nút. Để nâng cao hiệu quả của thuật toán phân cụm theo hướng tiếp cận vun đống

từ dưới lên (sẽ được trình bày cụ thể ở phần sau), mỗi đặc trưng được lưu vào

một nút trên cây dưới dạng một cụm (cluster) độc lập, trong đó mỗi cụm được

thể hiện bằng một cấu trúc CLUSTER với các trường thông tin được mô tả cụ

thể trên Hình 2.7.

Tên trường Kiểu trường Mô tả

Clustered SampleCoun t Left Right Mean SampleID bool interger CLUSTER * CLUSTER * Float* interger

Xác nhận dữ liệu đã được phân cụm hay chưa

Số lượng mẫu trong cụm này Con trỏ tới cây con trái

Con trỏ tới cây con phải

Vector trung bình của cụm (adsbygoogle = window.adsbygoogle || []).push({});

Chỉ số của mẫu được lưu trong cụm

Hình 2.7: Cấu trúc CLUSTER

Các thuật toán vun đống (Agglomerative) thường bắt đầu với mỗi đối tượng được coi như một cụm riêng biệt và tiến hành ghép lần lượt các nhóm

theo một độ đo khoảng cách.

Trường thông tin BranchPoint được sử dụng nhằm làm đơn giản hóa quá

trình xóa một nút trên cây, trong khi đó các trường thông tin LeftBranch, RightBranch được sử dụng để thu hẹp (pruning) phạm vi tìm kiếm trong quá

trình xác định các láng giềng gần nhất phục vụ cho việc phân cụm dữ liệu.

Thông tin về mỗi chiều của cây được thể hiện bằng một cấu trúc DIM_DESC, được mô tả cụ thể trên Hình 2.8.

Tên trường Kiểu trường Mô tả Split Min Max SRange SHRange SMRange bool float float float float float

Nhận giá trị TRUE hoặc FALSE

Cận dưới của phạm vi tìm kiếm cho các chiều

Split

Cận trên của phạm vi tìm kiếm cho các chiều

Split

Phạm vi tìm kiếm

Một nửa phạm vi tìm kiếm

Trung bình phạm vi tìm kiếm

Hình 2.8: Cấu trúc DIM_DESC mô tả mỗi chiều của cây K-D

Thuộc tính Split nhận giá trị TRUE trong trường hợp chiều đang xét được sử dụng để tạo siêu phẳng phân tách. Phạm vi tìm kiếm SRange được xác định bằng (Max-Min), một nửa phạm vi tìm kiếm SHRange là (Max-Min)/2, trung bình của phạm vi tìm kiếm là (Max+Min)/2. Các thuộc tính này được sử dụng với mục đích nhằm tối ưu hóa quá trình tìm kiếm.

Phần sau đây sẽ mô tả từng bước trong quá trình phân cụm tập đặc trưng

một cách chi tiết hơn.

2.2.1.3 Thuật toán phân cụm

Thuật toán này sẽ thực hiện quá trình phân cụm theo cách tiếp cận vun đống từ dưới lên (bottom-up) trên tập mẫu đãđược lưu trữ bởi cây cấu trúc

cây K-D ở trên. Cụ thể hơn, thuật toán sẽ bắt đầu với mỗi mẫu được coi như một cụm riêng biệt và ghép dần các nhóm dựa trên khoảng cách

Euclidian. Tại bước xử lý đầu tiên, thuật toán sẽ tiến hành duyệt từ nút gốc

của cây và xác định láng giềng gần nhất cho mỗi mẫu được thể hiện bởi nút được thăm. Bước tiếp theo sẽ tiến hành ghép dần mỗi cụm với láng giềng

của nó để tạo thành một cụm mới. Xác định láng giềng gần nhất cho mỗi

cụm mới được tạo ra và tiếp tục quá trình ghép cụm cho đến khi không còn cụm nào để ghép hoặc điều kiện phân cụm được thỏa mãn . Thuật toán được

mô tả cụ thể như sau:

Thuật toán 2.1: Thuật toán phân cụm (adsbygoogle = window.adsbygoogle || []).push({});

Input:

KDTree: cây K-D lưu trữ toàn bộ các đặc trưng cần phân cụm.

Output:

KDTree: Cây K-D chứa các cụm đặc trưng.

BEGIN

Bước 1: {Khởi tạo các cấu trúc dữ liệu}

SampleCount = Tổng số Sample được lưu trên cây.

PTClusters = Khởi tạo mảng chứa SampleCount phần tử kiểu

PTCLUSTER;

Heap = CreateNewHeap (SampleCounts);

Bước 2:

{Duyệt cây, xác định các cụm tiềm năng cho từng Sample, và đặt chúng vào heap}

If (KDTree→Left≠ NULL) then

TraverseTree_CreatePTClusters( KDTree→Left, GetNextLevel(-1)) End if

Bước3:{Tiến hành ghép cụm}

{Lấy các PotentialCluster từ đinht của heap, kiểm tra các điều kiện ghép}

HeapEntry = GetTopHeap(Heap); While (HeapEntry≠EMPTY) do

PotentialCluster = HeapEntry.Data;

C3.1. {Nếu cụm chính trong PotentialCluster đã thuộc vào cụm khác thì bỏ qua}

If (PotentialCluster→Cluster→Clustered = TRUE) then continue;

C3.2. {Nếu cụm chính chưa được phân cụm nhưng láng giềng của nó đã thuộc vào cụm khác thì phải tìm một láng giềng mới}

If (PotentialCluster→Neighbor→Clustered = TRUE) then

{Tìm kiếm một láng giềng mới cho PotentialClusterCluster}

PotentialCluster→Neighbor =

FindNearestNeighbor

(KDTree, PotentialCluster→Cluster, & HeapEntry.Key);

{Nếu tìmđược thì lưu PotentialCluster trở lại Heap để xử lý ở bước sau }

If (PotentialCluster→Neighbor≠NULL) then

End if

End if (adsbygoogle = window.adsbygoogle || []).push({});

C3.2. {Nếu cả Cluster chính và láng giềng của nó đều chưa được phân cụm

thì

tiến hành ghép 2 cụm này thành một cụm mớ i. Xác định láng giềng

cho cụm

mới, lưu PotentialCluster tương ứng vào Heap đế tiếp tục xử lý ở bước sau}

If (PotentialCluster→Cluster→Clustered = FALSE and PotentialCluster→Cluster→Clustered = FALSE) then

{Tiến hành ghép Cluster và Neighbor của PotentialCluster thành cụm

mới}

PotentialCluster→Cluster =

MergeClusters(PotentialCluster→Cluster, PotentialCluster→Neighbor);

{Tìm kiếm một láng giềng cho cụm vừa tạo}

PotentialCluster→Neighbor =

FindNearestNeighbor

(KDTree, PotentialCluster→Cluster,&HeapEntry.Key);

{ Nếu tìmđược,lưu PotentialCluster hiện tại trở lại Heap để xử lý ở bước

sau}

If (PotentialCluster→Neighbor≠ NULL) then

End if

End if End While END.

Trong đó, thủ tục CreateNewHeap (SampleCounts) có nhiệm vụ tạo mới

một cấu trúc HEAP để lưu SampleCount phần tử, với SampleCount là tổng số đặc trưng đượcbiểu diễn trên cây.

Thủ tục TraverseTree_CreatePTClusters(.) ở bước 2 được sử dụng cho

việc duyệt cây và xác định các cụm tiềm năng (potential cluster). Trong đó

Cluster là cụm đãđược khởi tạo tại mỗi nút trên cây và Neighbor (láng giềng

của nó).

Thủ tục FindNearestNeighbor(.) có nhiệm vụ tìm kiếm và trả về láng

giềng gần nhất của cụm đang xét.

Sau khi quá trình xác định các cụm tiềm năng đã hoàn tất, thuật toán sẽ

tiến hành chuyển các cụm tiềm năng thành các cụm thực sự bằng cách ghép

cụm chính và láng giềng gần nhât của nó nếu chúng thỏa mãn. Với mỗi cụm (adsbygoogle = window.adsbygoogle || []).push({});

tiềm năng, có thể xảy ra một trong 3 khả năng: (1) Nếu cụm chính đã được

ghép vào cụm khác thì bỏ qua, không cần xét đến cụm này nữa; (2) Nếu cụm chính chưa phân cụm nhưng láng giềng của nó đã được ghép vào cụm khác

thì sẽ tìm một láng giềng khác thay thế.(3) Nếu cả cụm chính và láng giềng

của nó đếu chưa được phân cụm thì tiến hành ghép 2 cụm này để tạo thành một cụm mới. Việc ghép cụm sẽ được thực hiện thông qua thuật toán

Thuật toán 2.2: Thuật toán ghép 2 cụm gần nhau

MergeClusters(Cluster, Neighbor) Input:

- Cluster: Cụm chính.

- Neighbor: Láng giềng của Cluster.

Output:

- NewCluster: Con trỏ đến vị trí cụm mới được tạo trên cây K -D.

BEGIN

{Tạo mới một cấu trúc CLUSTER}

NewCluster = CreateNewCluster();

{Thiết lập các thuộc tính}

NewCluster→Clustered = FALSE; NewCluster→Prototype = FALSE; NewCluster→Left = Cluster; NewCluster→Right = Neighbor;

NewCluster→Left→Clustered = TRUE; NewCluster→Left→Right = TRUE;

{Ghép dữ liệu từ hai cụm đầu vào}

NewCluster→SampleCount=Cluster→SampleCount + Neighbor→SampleCount;

{Xóa hai cụm đầu vào khỏi cây K-D}

DeleteFromKDTree (KDTree, Cluster→Mean, Cluster);

DeleteFromKDTree (KDTree, Neighbor→Mean, Neighbor);

{Lưu dữ liệu vừa tạo vào cây K-D}

InsertToKDTree(KDTree, NewClusterMean, NewCluster); END

Việc ghép dữ liệu được thực hiện bằng cách tạo ra một cấu trúc cụm mới (CreateNewCluster), sau đó tiến hành ghép dữ liệu của hai cụm con và đặt

vào phần dữ liệu của cụm mới tạo đồng thời hai cụm này sẽ được đặt tương ứng vào hai vị trí con trái (Left) và con phải (Right) của cụm vừa tạo. Hai

cụm con này được đánh dấu là đãđược phân cụm (Clustered = TRUE) và sa u

đó được xóa khỏi cây. Cụm mới sau khi được tạo sẽ được lưu vào cây K-D

đồng thời cũng được lưu trở lại vào Heap để tiếp tục xử lý ở bước sau. Thủ

tục DeleteFromKDTree(KDTree, Key, Data) được sử dụng để xóa một nút

trên cây K-D mà có giá trị khóa bằng Key và nội dung dữ liệu là Data. Quá (adsbygoogle = window.adsbygoogle || []).push({});

trình ghép cụm tiếp tục được thực hiện cho đến khi tất cả các cụm tiềm năng trong Heap đã được xét hết. Lúc này bước xử lý cuối cùng sẽ tiến hành lựa

chọn các cụm đặc trưng để tạo ra các Template phục vụ cho quá trình phân lớp. Một cụm đặc trưng sẽ được chọn làm Template nếu số lượng các đặc trưng trong đó đủ lớn và các chiều của cụm là độc lập. Trong đó, một chiều được coi là độc lập với chiều khác nếu độ lớn của hệ số tương quan

(correlation coefficient) là nhỏ hơn một giá trị ngưỡng cho trước (ở đây được

chọn bằng 1.0). Trong đó, hệ số tương quan giữa hai chiều di, dj được xác định như sau:

( ) ) ( ) ( , ) , ( j i j i j i d V d Var d d Cov d d

Coeffi = , với Cov(di, dj) là hiệp phương sai của

Một phần của tài liệu Nghiên cứu phương pháp nhận dạng chữ việt in chất lượng thấp (Trang 38 - 52)