1. Trang chủ
  2. » Luận Văn - Báo Cáo

Nghiên cứu và cài đặt các thuật toán phân lớp dữ liệu

42 770 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 42
Dung lượng 1,33 MB

Nội dung

Nghiên cứu và cài đặt các thuật toán phân lớp dữ liệu TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN CAO HỌC CÔNG NGHỆ THÔNG TIN QUA MẠNG KHAI PHÁ DỮ LIỆU VÀ KHO DỮ LIỆU BÀI THU HOẠCH: NGHIÊN CỨU VÀ CÀI ĐẶT CÁC THUẬT TOÁN PHÂN LỚP DỮ LIỆU Giảng viên: PGS. TS. Đỗ Phúc Học viên thực hiện: Huỳnh Tuấn Anh CH1101004 Khóa 6 TpHCM, 11/2012 GV: PGS. TS. Đỗ Phúc HVTH: Huỳnh Tuấn Anh Nghiên cứu và cài đặt các thuật toán phân lớp dữ liệu Lời cám ơn. Em xin chân thành cám ơn TS. Đỗ Phúc đã tận tình hướng dẫn, chỉ bảo chúng em trong suốt thời gian học chuyên đề này. Xin chân thành cám ơn quý thầy cô trong Trường Đại Học Công Nghệ Thông Tin, Đại Học Quốc Gia Tp.HCM đã tận tình giảng dạy, trang bị cho em những kiến thức quý báu, tạo mọi điều kiện tốt cho chúng em học tập và nghiên cứu. Xin chân thành cám ơn gia đình và bạn bè đã ủng hộ, giúp đỡ và động viên em trong thời gian học tập và nghiên cứu. Mặc dù đã cố gắng hoàn thành bài luận nhưng chắc chắn không tránh khỏi thiếu sót. Em kính mong nhận được sự thông cảm và tận tình chỉ bảo của quý thầy cô. Học viên thực hiện Huỳnh Tuấn Anh TpHCM, 08/2012 GV: PGS. TS. Đỗ Phúc HVTH: Huỳnh Tuấn Anh Nghiên cứu và cài đặt các thuật toán phân lớp dữ liệu Mục Lục GV: PGS. TS. Đỗ Phúc HVTH: Huỳnh Tuấn Anh Nghiên cứu và cài đặt các thuật toán phân lớp dữ liệu Chương 1: THUẬT TOÁN FIND-S 1. HỌC KHÁI NIỆM VÀ BÀI TOÁN CỤ THỂ Theo Tom M.Mitchell: “Nhiều vấn đề học đòi hỏi các khái niệm tổng quát thu được từ các ví dụ huấn luyện. … Vấn đề tự động kết luận về sự xác định tổng quát nhất của một vài khái niệm, các ví dụ cho trước được ghi nhãn có phải là bộ phận của khái niệm hay không, nhiệm vụ đó thường được xem như là học khái niệm.” 1.1. Học khái niệm - Cho trước các ví dụ huấn luyện. mỗi ví dụ huấn luyện cho biết có thuộc khái niệm hay không? (thuộc: positive; không: negative) - Đưa ra khái niệm tổng quát phân loại tập huấn luyện. Khái niệm tổng quát là hàm boolean được định nghĩa trên tập cá thể. - “Học khái niệm là đưa ra một hàm boolean từ tập input và putput của các ví dụ huấn luyện” (Tom M.Mitchell – Machine Learning) • Ví dụ: o (Input) Các ví dụ huấn luyện:  Tập các animal cùng thuộc tính của nó. o (Output) Khái niệm được trích ra:  Bird  Cat  … 1.2. Bài toán cụ thể - (Input) Tập ví dụ huấn luyện gồm 4 cá thể sau: o Tập này nói về những ngày (như thế nào đó) mà Aldo thích chơi môn thể thao dưới nước của anh ta (Table 2.1 – Positive and negative training examples gor thw target concept EnjoySport, Machine Learning – Tom M.Mitchell, 2003). Example Sky AirTem p Humidit y Wind Water Forecast EnjoySport 1 Sunny Warm Normal Strong Warm Same Positive 2 Sunny Warm High Strong Warm Same Positive 3 Rainy Cold High Strong Warm Change Negative 4 Sunny Warm High Strong Cool Change Positive Bảng 1.1 – Các ví dụ huấn luyện thuộc và không thuộc khái niệm đích EnjoySport - (Output) Khái niệm được học: “EnjoySport” 1.3. Giả thiết GV: PGS. TS. Đỗ Phúc 4 HVTH: Huỳnh Tuấn Anh Nghiên cứu và cài đặt các thuật toán phân lớp dữ liệu - Cũng được hiểu là khái niệm. Là hội của các ràng buộc trên thuộc tính của cá thể. - X là cá thể, và X thoả mãn tất cả các ràng buộc trên giả thiết h thì h [hân loại X là positive (h(X) = 1) - Ví dụ: Giả thiết là Aldo thích môn thể thao dưới nước vào nagỳ “cold days with high humidity”, giả thiết được ghi là: o <?, Clod, High, ?, ?, ?> - Giả thiết tổng quát nhất: o <?, ?, ?, ?, ?, ?> - Giả thiết cụ thể nhất: o <Ø, Ø, Ø, Ø, Ø, Ø> 1.4. Ký hiệu - Tập cá thể (set of instances) o Tập được dùng để trích khái niệm từ đó o Ký hiệu: X o Ví dụ trên: tập cá thể = tập ngày, mỗi ngày có 6 thuộc tính. - Khái niệm đích (target concep) o Khái niệm (hàm) được học. o Ký hiệu: c c: X  {0,1}  Ví dụ trên: c(X) = 1 nếu EnjoySport = Yes  Ví dụ trên: c(X) = 0 nếu EnjoySport = No - Các ví dụ huấn luyện, gồm có: o Một cá thể thuộc X. o Khái niệm đích c(X). Viết là: <X, x(X)> - Tập các giả thiết (H): các giả thiết về sự phân loại tập cá thể. - Chương trình học: o Cho trước tập ví dụ huấn luyện. o Đưa ra giả thiết về sự phân loại tập cá thể: h(X) = c(X) 1.5. Thứ tự các giả thiết - Các giả thiết trong không gian đều có thứ tự - Có thể sắp xếp theo dạng: Tổng quát  cụ thể. - Thứ tự: o hj và hk là hai giả thiết. o hj được nó là tổng quát hơn hay bằng hk nếu và chỉ nếu: (∀x Є X)[(h k (x) = 1)  (h j (x) =1)] o Ký hiệu: h j ≥ g h k - Ví dụ: h 2 ≥ g h 1 với h 1 và h 2 sau: o h 1 = <Sunny, ?, ? , Strong, ?, ?> o h 2 = <Sunny, ?, ? , ?, ?, ?> 2. THUẬT TOÁN FIND – S: TÌM MỘT GIẢ THUYẾT ĐẶC THÙ NHẤT GV: PGS. TS. Đỗ Phúc 5 HVTH: Huỳnh Tuấn Anh Nghiên cứu và cài đặt các thuật toán phân lớp dữ liệu 2.1. Thuật toán Find-S 1. h = giả thiết cụ thể nhất trong H. 2. Với mỗi x Є tập ví dụ huấn luyện, mà c(X) = 1 o Với mỗi ràng buộc a i trong h  IF a i thoả bởi x THEN do nothing ELSE thay a i bởi ràng buộc tổng quát hơn kế tiếp mà nó được thoả bởi x 3. Xuất ra h. 2.2. Áp dụng thuật toán với ví dụ huấn luyện mục 1.2: - h  < ∅ , ∅ , ∅ , ∅ , ∅ , ∅ > - Cá thể 1 (positive): <Sunny, Warm, Normal, Strong , Warm , Same > o h  <Sunny, Warm, Normal, Strong , Warm , Same > - Cá thể 2 (positive): <Sunny, Warm, High, Strong , Warm , Same > o h  <Sunny, Warm, ?, Strong , Warm , Same > - Cá thể 3 (negative): h không đổi. - Cá thể 4 (positive): <Sunny, Warm, High, Strong , Cold , Change > o h  <Sunny, Warm, ?, Strong , ? , ? > - OUTPUT: <Sunny, Warm, ?, Strong , ? , ? > 3. CÀI ĐẶT CHƯƠNG TRÌNH 3.1. Ngôn ngữ lập trình, biến môi trường, các thư viện được sử dụng - Thuật toán Find-S được viết bằng ngôn ngữ Maple (dùng Maple 12), sau đó đóng gói lại thành môt thư viện và lưu vào thư mục “C:\Find-S\”. - Chương trình được viết hoàn chỉnh dưới dạng thể hiện form liên kết bên dưới với package đã được tạo ra ở trên, bằng ngôn ngữ Java (dùng NetBeans IDE 6.5). - Biến môi trường: o Mục đích: kết nối Maple với Java o Cách đặt biến môi trường:  Click chuột phải vào My computer, chọn Properties.  Trong hộp thoại mới hiện ra, chọn tiếp Advanced System Setting nếu là Win Vista hoặc Win 7, Win XP thì chọn Advanced.  Trong hộp thoại System Properties, chọn Environment Variables… GV: PGS. TS. Đỗ Phúc 6 HVTH: Huỳnh Tuấn Anh Nghiên cứu và cài đặt các thuật toán phân lớp dữ liệu  Trong bảng System Variables, chọn Path trong phần Variables, rồi bấm Edit.  Trong hộp thoại Edit System Variable, thêm dòng sau vào mục Variable value “C:\Program Files\Maple 12\bin.win”. Lưu ý: ngăn cách giữa các Variable value là các dấu “;”.  Bấm chọn OK (hoặc Apply) để đồng ý thay đổi.  Khởi động lại máy. - Một số thư viện đặc biệt được sử dụng: o com.maplesoft.openmaple.* : import các lớp OpenMaple của Java. o com.maplesoft.externalcall.MapleException : import lớp MapleException. Ngoài ra, chương trình còn sử dụng Maple Engine, engine này có chức năng kết nối với Maple để thực hiện các lệnh trong Maple. 3.2. Cấu trúc, chức năng các tập tin cài đặt và tập tin training examples 3.2.1. Các tập tin cài đặt: - Tập tin Find-S.mw: cài đặt thuật toán Find-S rồi đóng gói lại thành thư viện bằng chương trình Maple 12. - Tập tin demo.mw: chạy thử thuật toán đã được cài đặt ở trên với một số dữ liệu huấn luyện. - Tập tin Main.java: tạo form với các thao tác tương ứng trong chương trình (Tạo bảng, Đọc ví dụ huấn luyện từ tập tin, Hiển thị giả thiết đặc thù nhất). 3.2.2. Các tập tin training examples: Cấu trúc chung của các tập tin training examples dạng .txt là: - Mỗi dòng là một mô tả chi tiết các thuộc tính của một cá thể trong tập cá thể, mỗi thuộc tính cách nhau ít nhất một khoảng trắng hoặc một tab. Mỗi thuộc tính có một số giá trị hữu hạn. Cuối cùng là khái niệm đích. - Thứ tự giá trị cho mỗi thuộc tính trong ví dụ đó được nhập tương ứng. Tên tập tin, thuộc tính và các giá trị không chấp nhận các giá trị đặc biệt như: `, ~, &, (, ), !, #, %, ^, -, \, |, {, }, [, ], ;, có thể chấp nhận ký tự gạch dưới. 3.3. Nội dung các hàm chính và các tham số có liên quan - Trong Java, tập tin Main.java: o public Main() throwMapleException:  Khởi tạo Maple Engine với Java.  Đồng thời đặt Table không có Header. o void jButton2ActionPerformed(java.awt.event.ActionEvent evt): GV: PGS. TS. Đỗ Phúc 7 HVTH: Huỳnh Tuấn Anh Nghiên cứu và cài đặt các thuật toán phân lớp dữ liệu  Sự kiện của button Show Version Space, hiển thị những giả thiết phù hợp với Training Examples.  Gọi ShowMaximallySpecificHypothesis() o void jButton3ActionPerformed(java.awt.event.ActionEvent evt):  Sự kiện của button ReadFromFile. o void jButton4ActionPerformed(java.awt.event.ActionEvent evt):  Sự kiện button Create Table.  Tạo bảng với số dòng và số cột được cho trong jTextField1 ColunmCount và jTextField2 RowCount o void ShowMaximallySpecificHypothesis()  Hiển thị Maximally Specific Hypothesis lên jTextArea1  Thực hiện hàm FindS của package FindSAlgorithm bằng Maple với tập ví dụ huấn luyện đưa vào là D, sau đó lấy kết quả Maximally Specific Hypothesis trả về hiển thị lên jTextArea1 Maximally Specific Hypothesis trong form. Chuỗi S chứa tập ví dụ từ D[1] đến D[i], nhằm hiển thị kết quả theo từng bước thực hiện giải thuật. - Trong Maple, tập tin Find-S.mw: + Finding maximally specific hypothesis consistent with the training examples D FindS:=proc(D::list) h: kết quả trả về x: danh sách lưu mỗi ví dụ, không bao gồm giá trị phân loại cx: bằng 1 nếu giá trị của thuộc tính phân loại là positive, bằng 0 nếu là negative local h,x,cx,d,i; h:=[]; h ← giả thiết đặc thù nhất if nops(D)<>0 then for i from 1 to nops(D[1][1]) do h:=[op(h),` `]; od; fi; Với mỗi ví dụ huấn luyện d for d in D do x:=d[1]; cx:=d[2]; Nếu d là 1 positive example if cx=1 then Đối với mỗi ràng buộc trên thuộc tính trong h for i from 1 to nops(h) do Nếu x thỏa ràng buộc trên thuộc tính trong h thì không làm gì cả if h[i]=x[i] or h[i]=`?` then # do nothing GV: PGS. TS. Đỗ Phúc 8 HVTH: Huỳnh Tuấn Anh Nghiên cứu và cài đặt các thuật toán phân lớp dữ liệu Ngược lại, thay thế ràng buộc trong h bằng một ràng buộc tổng quát hơn để x thỏa nó else if h[i]=` ` then h[i]:=x[i]; else h[i]:=`?`; fi; fi; od; fi; od; RETURN (h); end: + Kiểm tra x có thỏa h hay không (x thỏa h nghĩa là h(x)=1, bất kể x là positive hay negative), kết quả trả về bằng 1 nếu thỏa, bằng 0 nếu ngược lại Classification:=proc(h::list,x::list) local i; for i from 1 to nops(h) do if h[i]=`?` or h[i]=x[i] then # do nothing elif h[i]=` ` or h[i]<>x[i] then RETURN (0); fi; od; RETURN (1); end: 4. HƯỚNG DẪN SỬ DỤNG CHƯƠNG TRÌNH - Đặt biến môi trường như mục 3.1 - Tạo thư mục Find-S tại thư mục gốc ổ đĩa C (tức là thư mục Find-S có đường dẫn như sau “C:\Find-S\”). Sau đó chạy tập tin Find-S.mw với phần mềm Maple để đóng gói thuật toán thành package lưu vào thư mục vừa tạo ở trên. - Chạy project Find-S với NetBeans. Giao diện chương trình như sau: GV: PGS. TS. Đỗ Phúc 9 HVTH: Huỳnh Tuấn Anh Nghiên cứu và cài đặt các thuật toán phân lớp dữ liệu - Có thể tạo tập ví dụ huấn luyện bằng một trong hai cách sau: o Tạo mới một Table: bằng cách nhập số cột (vào mục Column Count) và số dòng (vào mục Row Count) rồi bấm nút Create Table. o Bấm nút Read From File để load tập tin Training Examples sẵn có với cấu trúc giống như mô tả trong mục 3.2.2 - Bấm nút Show để hiện thị các giả thiết đặc thù nhất từ tập ví dụ huấn luyện. 5. MỘT SỐ VÍ DỤ VÀ KẾT QUẢ CHƯƠNG TRÌNH 5.1. EnjoySport training examples: - TrainingExample1.txt Sunny Warm Normal Strong Warm Same Positive Sunny Warm High Strong Warm Same Positive Rainy Cold High Strong Warm Change Negative Sunny Warm High Strong Cool Change Positive - Hiển thị Maximally Specific Hypothesis theo từng bước tính toán: h1 = [Sunny, Warm, Normal, Strong, Warm, Same] h2 = [Sunny, Warm, `?`, Strong, Warm, Same] GV: PGS. TS. Đỗ Phúc 10 HVTH: Huỳnh Tuấn Anh [...]... quả sau khi phân lớp: Result = sunburned GV: PGS TS Đỗ Phúc 31 HVTH: Huỳnh Tuấn Anh Nghiên cứu và cài đặt các thuật toán phân lớp dữ liệu Chương 3: THUẬT TOÁN CANDIDATE ELIMINATION GV: PGS TS Đỗ Phúc 32 HVTH: Huỳnh Tuấn Anh Nghiên cứu và cài đặt các thuật toán phân lớp dữ liệu 1 MÔ TẢ THUẬT TOÁN Thuật toán Candidate-Elimination tính version space chứa tất cả những giả thiết phù hợp với tập các ví dụ... sau khi phân lớp: EnjoySport = No 5.3 Sunburned training examples GV: PGS TS Đỗ Phúc 29 HVTH: Huỳnh Tuấn Anh Nghiên cứu và cài đặt các thuật toán phân lớp dữ liệu - Tải tập ví dụ huấn luyện đã có sẵn (tập tin TrainingExamples3.txt trong cùng thư mục) - Hiển thị luật - Hiển thị cây quyết định GV: PGS TS Đỗ Phúc 30 HVTH: Huỳnh Tuấn Anh Nghiên cứu và cài đặt các thuật toán phân lớp dữ liệu - Phân lớp cho... chương trình phân loại với ví dụ đã phân tích ở mục 2.3 - Tập ví dụ huấn luyện đã có sẵn (tập tin TrainingExamples1.txt đính kèm) - Hiển thị luật GV: PGS TS Đỗ Phúc 26 HVTH: Huỳnh Tuấn Anh Nghiên cứu và cài đặt các thuật toán phân lớp dữ liệu - Hiển thị cây quyết định - Phân lớp cho New Instance mới: GV: PGS TS Đỗ Phúc 27 HVTH: Huỳnh Tuấn Anh Nghiên cứu và cài đặt các thuật toán phân lớp dữ liệu x:=[Sunny,Hot,High,Weak]... [Japan,Honda,Red,1990,Sports] Kết quả x thuộc lớp: Negative Chương 2: THUẬT TOÁN ID3 1 MÔ TẢ CHUNG THUẬT TOÁN ID3 VÀ BÀI TOÁN GV: PGS TS Đỗ Phúc 12 HVTH: Huỳnh Tuấn Anh Nghiên cứu và cài đặt các thuật toán phân lớp dữ liệu 1.1 Thuật toán ID3 Thuật toán học quy nạp (inductive learning algorithm) cây quyết định ID3 là một thuật toán được sử dụng rộng rãi trong số nhiều thuật toán được đưa ra theo tiếp cận học dựa... d, và b/ Một số giả thiết trong S đặc thù hơn h • Xóa trong G tất cả các giả thiết nào ít tổng quát hơn các giả thiết khác trong G GV: PGS TS Đỗ Phúc 33 HVTH: Huỳnh Tuấn Anh Nghiên cứu và cài đặt các thuật toán phân lớp dữ liệu 2 CÀI ĐẶT THUẬT TOÁN 2.1 Hướng dẫn sử dụng chương trình: - Chương trình cài đặt thuật toán Candidate Elimination sử dụng ngôn ngữ Java và Maple, IDE Netbeans Dùng Maple để cài. .. kết quả phân loại là Positive, Negative, hay Don’t Know GV: PGS TS Đỗ Phúc 35 HVTH: Huỳnh Tuấn Anh Nghiên cứu và cài đặt các thuật toán phân lớp dữ liệu - Ngoài ra chương trình vẫn có thể chạy trong Maple mà không kết nối với Java (file demo.mw đính kèm) 2.2 Cài đặt thuật toán: - Hàm chính cài đặt thuật toán Candidate Elimination trong Maple như sau: > Tính version space chứa những giả thiết phù hợp... hiện các lệnh trong Maple 3.2 Cấu trúc, chức năng các tập tin cài đặt và tập tin training examples 3.2.1 Các tập tin cài đặt: - Tập tin ID3.mw: cài đặt thuật toán ID3 rồi đóng gói lại thành thư viện bằng chương trình - Maple 12 Tập tin demo.mw: chạy thử thuật toán đã được cài đặt ở trên với một số dữ liệu huấn - luyện; tính các chỉ số Entropy, Gain… trong các trường hợp tương ứng Tập tin DecisionTreeFrame.java:.. .Nghiên cứu và cài đặt các thuật toán phân lớp dữ liệu h3 = [Sunny, Warm, `?`, Strong, Warm, Same] h4 = [Sunny, Warm, `?`, Strong, `?`, `?`]  Kết quả thuật toán chính xác với phần áp dụng thuật toán cho ví dụ huấn luyện mục 2.2 Phân lớp một New Instance mới: x:= [Sunny,Cold,Low,Strong,Warm,Same] Kết quả x thuộc lớp: Negative 5.2 Sunburned training examples:... Target_Attribute, Attributes – {A}) - End /*Begin*/ Return Root 3 CÀI ĐẶT CHƯƠNG TRÌNH GV: PGS TS Đỗ Phúc 18 HVTH: Huỳnh Tuấn Anh Nghiên cứu và cài đặt các thuật toán phân lớp dữ liệu 3.1 Ngôn ngữ lập trình, biến môi trường, các thư viện được sử dụng - Thuật toán ID3 được viết bằng ngôn ngữ Maple (dùng Maple 12), sau đó đóng gói lại - thành môt thư viện và lưu vào thư mục “C:\ID3\” Chương trình được viết hoàn chỉnh... form với các thao tác tương ứng (Tạo bảng, Đọc ví dụ huấn luyện từ tập tin, Hiển thị các luật, Hiển thị cây quyết định) 3.2.2 Các tập tin training examples: Cấu trúc chung của các tập tin training examples dạng txt là: GV: PGS TS Đỗ Phúc 19 HVTH: Huỳnh Tuấn Anh Nghiên cứu và cài đặt các thuật toán phân lớp dữ liệu - Dòng đầu tiên mô tả các thuộc tính có trong ví dụ huấn luyện, mỗi thuộc tính cách nhau . Nghiên cứu và cài đặt các thuật toán phân lớp dữ liệu TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN CAO HỌC CÔNG NGHỆ THÔNG TIN QUA MẠNG KHAI PHÁ DỮ LIỆU VÀ KHO DỮ LIỆU BÀI THU HOẠCH: NGHIÊN CỨU VÀ CÀI. Huỳnh Tuấn Anh Nghiên cứu và cài đặt các thuật toán phân lớp dữ liệu 1.1. Thuật toán ID3 Thuật toán học quy nạp (inductive learning algorithm) cây quyết định ID3 là một thuật toán được sử dụng. Huỳnh Tuấn Anh Nghiên cứu và cài đặt các thuật toán phân lớp dữ liệu Chương 1: THUẬT TOÁN FIND-S 1. HỌC KHÁI NIỆM VÀ BÀI TOÁN CỤ THỂ Theo Tom M.Mitchell: “Nhiều vấn đề học đòi hỏi các khái niệm

Ngày đăng: 09/04/2015, 22:04

Nguồn tham khảo

Tài liệu tham khảo Loại Chi tiết
[1] Tom M. Mitchell, Machine Learning, The McGraw-Hill Companies, Inc., 1997 Sách, tạp chí
Tiêu đề: Machine Learning
[2] Lê Thành Sách, Trí tuệ nhân tạo, ĐH Bách khoa – ĐHQG TPHCM Sách, tạp chí
Tiêu đề: Trí tuệ nhân tạo
[3] Võ Văn Thành, Bài tập Luật phân lớp , ĐH CNTT – ĐHQG TPHCM Sách, tạp chí
Tiêu đề: Bài tập Luật phân lớp
[5] Howard J.Hamilton, Computer Science 831 course, Department of Computer Science, University of Regina, Canada: http://www2.cs.uregina.ca/~dbd/cs831/index.html Sách, tạp chí
Tiêu đề: Computer Science 831 course
[6]Wikipedia – ID3 Algorithm: http://en.wikipedia.org/wiki/ID3_algorithm Link
[4] Võ Huỳnh Trâm &amp; Trần Ngân Bình, Học máy Khác

TỪ KHÓA LIÊN QUAN

TRÍCH ĐOẠN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w