intTypePromotion=1

Ứng dụng mẫu thiết kế xây dựng mô hình giải một số bài toán hồi quy

Chia sẻ: Thi Thi | Ngày: | Loại File: PDF | Số trang:7

0
46
lượt xem
1
download

Ứng dụng mẫu thiết kế xây dựng mô hình giải một số bài toán hồi quy

Mô tả tài liệu
  Download Vui lòng tải xuống để xem tài liệu đầy đủ

Bài toán hồi quy được sử dụng nhiều trong khoa học kỹ thuật, kinh tế-xã hội… phục vụ cho các công việc như phân tích xu hướng tiến triển của các các hiện tượng, tính toán tối ưu hóa, công tác dự báo... Trong công nghệ phần mềm, mẫu thiết kế là một giải pháp tổng thể cho các vấn đề chung trong thiết kế phần mềm. Trong bài báo này chúng tôi sẽ xây dựng và thiết kế mô hình giải các bài toán hồi quy theo các mẫu thiết kế mà Gamma đã đề xuất. Từ đó có một cái nhìn sâu sắc hơn một số mẫu thiết kế, cũng như tìm hiểu một số tính năng mới của ngôn ngữ C# làm cho dễ dàng hơn trong thiết kế phần mềm theo hướng đối tượng.

Chủ đề:
Lưu

Nội dung Text: Ứng dụng mẫu thiết kế xây dựng mô hình giải một số bài toán hồi quy

Nguyễn Mạnh Đức<br /> <br /> Tạp chí KHOA HỌC & CÔNG NGHỆ<br /> <br /> 122(08): 129 - 135<br /> <br /> ỨNG DỤNG MẪU THIẾT KẾ XÂY DỰNG MÔ HÌNH<br /> GIẢI MỘT SỐ BÀI TOÁN HỒI QUY<br /> Nguyễn Mạnh Đức*<br /> Trường Đại học Sư phạm – ĐH Thái Nguyên<br /> <br /> TÓM TẮT<br /> Bài toán hồi quy được sử dụng nhiều trong khoa học kỹ thuật, kinh tế-xã hội… phục vụ cho các<br /> công việc như phân tích xu hướng tiến triển của các các hiện tượng, tính toán tối ưu hóa, công tác<br /> dự báo... Trong công nghệ phần mềm, mẫu thiết kế là một giải pháp tổng thể cho các vấn đề chung<br /> trong thiết kế phần mềm. Trong bài báo này chúng tôi sẽ xây dựng và thiết kế mô hình giải các bài<br /> toán hồi quy theo các mẫu thiết kế mà Gamma đã đề xuất. Từ đó có một cái nhìn sâu sắc hơn một<br /> số mẫu thiết kế, cũng như tìm hiểu một số tính năng mới của ngôn ngữ C# làm cho dễ dàng hơn<br /> trong thiết kế phần mềm theo hướng đối tượng.<br /> Từ khóa: Các mẫu thiết kế, mẫu thiết kế chiến lược, ngôn ngữ mô hình hóa thống nhất, bài toán<br /> hồi quy tuyến tính, bài toán hồi quy phi tuyến, khách hàng<br /> <br /> GIỚI THIỆU*<br /> Trong công nghệ phần mềm, một mẫu thiết kế<br /> (design pattern) là một giải pháp tổng thể cho<br /> các vấn đề chung trong thiết kế phần mềm.<br /> Một mẫu thiết kế không phải là một thiết kế<br /> hoàn thiện để mà có thể được chuyển đổi trực<br /> tiếp thành mã, nó chỉ là một khung sườn mô<br /> tả cách giải quyết một vấn đề mà có thể được<br /> dùng lại trong nhiều tình huống khác nhau. Các<br /> mẫu thiết kế hướng đối tượng thường cho thấy<br /> mối quan hệ và sự tương tác giữa các lớp hay<br /> các đối tượng, mà không cần chỉ rõ các lớp hay<br /> đối tượng của từng ứng dụng cụ thể [1].<br /> Các mẫu thiết kế có thể giúp tăng tốc quá<br /> trình phát triển phần mềm bằng cách cung cấp<br /> các mẫu hình phát triển đã được chứng thực<br /> và kiểm chứng. Nó cung cấp các giải pháp<br /> chung, được viết tài liệu dưới một định dạng<br /> mà không gắn liền với một vấn đề cụ thể nào.<br /> Các mẫu thiết kế cho phép các nhà phát triển<br /> giao tiếp với nhau dùng các tên dễ hiểu được<br /> dùng rộng rãi để đặt cho các đối tượng tương<br /> tác của phần mềm [4, 5].<br /> Mục đích các công việc của chúng tôi ở<br /> đây là xây dựng và thiết kế mô hình giải một<br /> số bài toán hồi quy theo mẫu thiết kế mà<br /> Gamma đã đề xuất. Từ đó có một cái nhìn sâu<br /> sắc hơn về một số mẫu thiết kế có thể được<br /> *<br /> <br /> Tel: 0915 564 249; Email: nmductn@yahoo.com<br /> <br /> thực hiện trong C#, và tìm hiểu xem các tính<br /> năng mới của ngôn ngữ trong thực tế, làm cho<br /> nó dễ dàng hơn trong thiết kế phần mềm<br /> theo hướng đối tượng.<br /> Sau phần giới thiệu, phần 2 sẽ xem xét mẫu<br /> thiết kế Chiến lược (Strategy) do Gamma và<br /> cộng sự đã đề xuất [1]; Phần 3 sẽ nêu ra một<br /> số bài toán hồi quy được quan tâm; Phần 4 là<br /> một đề xuất mới về việc xây dựng và thiết kế<br /> một mô hình giải các bài toán hồi quy theo<br /> mẫu thiết kế; Cuối cùng phần 5 sẽ bao gồm<br /> một số nhận xét, kết luận và các công việc<br /> trong tương lai.<br /> MẪU<br /> THIẾT<br /> KẾ<br /> CHIẾN<br /> (STRATEGY PATTERN):<br /> <br /> LƯỢC<br /> <br /> Mẫu Strategy được định nghĩa là một họ các<br /> thuật toán, đóng gói các thuật toán liên quan<br /> và làm chúng hoán đổi cho nhau, điều này<br /> cho phép lựa chọn các thuật toán thay đổi độc<br /> lập với khách hàng sử dụng nó và thay đổi<br /> theo thời gian. Việc xây dựng các mẫu<br /> Strategy là để đóng gói một số lượng chiến<br /> lược trong một mô-đun duy nhất và cung cấp<br /> một giao diện đơn giản cho phép các khách<br /> hàng lựa chọn giữa các chiến lược [1].<br /> Cấu trúc của mẫu Strategy như trên hình 1,<br /> trong đó:<br /> Strategy: Định nghĩa giao diện (hay lớp trừu<br /> tượng) cho tất cả các lớp thể hiện giải thuật.<br /> 129<br /> <br /> Nguyễn Mạnh Đức<br /> <br /> Tạp chí KHOA HỌC & CÔNG NGHỆ<br /> <br /> Trong quá trình khởi tạo đối tượng để có thể<br /> thêm dữ liệu từ trong Context.<br /> ConcreteStrategy: Là các hiện thực của giao<br /> diện Strategy để thể hiện một giải thuật cụ thể.<br /> Context: Tại thời điểm biên dịch chỉ sử dụng<br /> đối tượng kiểu Strategy khi xác định giải<br /> thuật cho vấn đề cần xử lý; Tại thời điểm thực<br /> thi được cung cấp một đối tượng giải thuật cụ<br /> thể thay thế cho đối tượng Strategy.<br /> Mẫu Strategy có thể được áp dụng<br /> những trường hợp sau [1]:<br /> <br /> trong<br /> <br /> Nhiều lớp liên quan chỉ khác nhau ở cách xử<br /> lý yêu cầu. Với một lựa chọn trong những<br /> cách xử lý theo mẫu Strategy giúp ta thực<br /> hiện trách nhiệm của một lớp.<br /> Có nhiều cách thực hiện cùng một thuật toán.<br /> Phải cho khách hàng khả năng lựa chọn cách<br /> ưu việt nhất trong sử dụng tài nguyên và thời<br /> gian. Nên dùng Strategy khi các thuật toán<br /> này được thể hiện như môt cơ cấu lớp của các<br /> thuật toán. Thuật toán cần phải được che dấu<br /> cả về dữ liệu và cấu trúc đối với các Client.<br /> Dùng Strategy để thay thế việc công khai hoá<br /> những cấu trúc dữ liệu phức tạp, đặc thù cho<br /> thuật toán. Khách hàng định nghĩa nhiều cách<br /> xử lý khác nhau và những cách xử lý này có<br /> thể coi như các câu lệnh rẽ nhánh (if- thenelseif, switch) trong phương thức, thay vì<br /> dùng các cấu trúc điều kiện ta sẽ dùng các lớp<br /> Strategy cài đặt riêng cho từng nhánh.<br /> <br /> Trong [6] chúng tôi đã cài đặt Strategy<br /> Pattern bằng ngôn ngữ C# [2, 3, 7]. Các đoạn<br /> mã ở đó đã minh chứng cho mô hình<br /> Strategy, sự đóng gói chức năng hình thức<br /> của một đối tượng được thực hiện trong C#<br /> dựa vào cấu trúc của mẫu Strategy như trong<br /> hình 1. Trong các phần sau chúng tôi sẽ đề<br /> xuất xây dựng và thiết kế mô hình áp dụng<br /> giải quyết bài toán hồi quy theo Strategy<br /> Pattern.<br /> BÀI TOÁN HỒI QUY<br /> Các bài toán hồi quy được sử dụng trong<br /> nhiều lĩnh vực. Sau đây chúng ta xét một<br /> dạng bài toán hồi quy tuyến tính và phi tuyến<br /> tính hay được sử dụng nhất.<br /> Bài toán hồi quy tuyến tính<br /> Mô hình hồi quy tuyến tính bội có dạng như<br /> sau [8]:<br /> <br /> Yi  0  1Xi1  2 Xi 2  n Xin  u i<br /> <br /> (1)<br /> <br /> trong đó: ui là các biến ngẫu nhiên không<br /> tương quan có kỳ vọng bằng 0 và phương sai<br /> không đổi 2; 0, 1, 2, ... , n là các tham số<br /> cần ước lượng.<br /> <br /> ˆ , ˆ ,..., ˆ của 0, 1, 2, ...,<br /> Các ước lượng <br /> 0<br /> 1<br /> n<br /> n được xác định bằng phương pháp bình<br /> phương tối thiểu. Ngoài việc ước lượng, nếu<br /> muốn tìm khoảng tin cậy của các tham số hay<br /> tiến hành kiểm định, ta phải giả thiết thêm các<br /> biến ngẫu nhiên có phân phối chuẩn ui  N(0,<br /> 2) [8].<br /> <br /> Hình 1: Cấu trúc mẫu Strategy [1]<br /> <br /> 130<br /> <br /> 122(08): 129 - 135<br /> <br /> Nguyễn Mạnh Đức<br /> <br /> Tạp chí KHOA HỌC & CÔNG NGHỆ<br /> <br /> Một số bài toán hồi quy phi tuyến<br /> Sau đây ta xét một số dạng hồi quy phi tuyến<br /> điển hình rất hay được sử dụng trong khoa<br /> học kỹ thuật, kinh tế-xã hội, khoa học dự báo,<br /> sinh học... Các dạng bài toán này đều có thể<br /> đưa được về dạng hồi quy tuyến tính [8, 9].<br /> Bài toán hồi quy phi tuyến dạng mũ (hàm<br /> Cobb Douglas)<br /> Mô hình hồi quy mũ có dạng :<br /> yi = b0 Xi1b1 Xi2b2 … Xinbn<br /> <br /> (2)<br /> <br /> Để xác định các tham số b i (i = 0,1, ..., n) từ<br /> các số liệu thu thập, ta chuyển về dạng bài<br /> toán hồi quy bội bằng cách logarit tự nhiên<br /> hai vế (2), đặt Y = lnyi, b’ = lnb0, Xi = lnxi (i =<br /> 1 .. n), thì được bài toán tuyến tính bội Y = b’<br /> + b1X1 + b2X2 + ... + bnXn.<br /> Bài toán Cobb Douglas tổng quát<br /> Mô hình Cobb Douglas tổng quát có dạng:<br /> <br /> Y (t )  ae<br /> <br /> m<br /> <br /> bt<br /> <br />  x (t )<br /> i<br /> <br /> i<br /> <br /> (3)<br /> <br /> i 1<br /> <br /> Trong đó : a, b, i > 0, i = 1 .. m<br /> m<br /> <br /> <br /> i 1<br /> <br /> i<br /> <br /> 1<br /> <br /> t là biến thời gian (t = 1, 2, ...); x i(t) là các<br /> nhân tố sản xuất; Y(t) là các kết quả sản xuất.<br /> Để xác định các hệ số a, b, i, ta logarit tự<br /> nhiên hai vế (3) và biến đổi như sau:<br /> lnY = lna + bt + 1lnx1 + ... + m-1lnxm-1 +<br /> mlnxm = lna + bt + 1lnx1 + ... + m-1lnxm-1 +<br /> (1- 1 - ... - m-1)lnxm.<br /> Hay: lnY - lnxm = lna + bt + 1(lnx1 - lnxm) +<br /> 1(lnx2 - lnxm) +...+ m-1(lnxm-1 - lnxm) <br /> ln(Y/xm) = lna + bt + 1ln(x1/xm) +<br /> 2ln(x2/xm) + ... + m-1ln(xm-1/xm).<br /> Đặt: ln(Y/xm) = g; lna = k; ln(xi/xm) = Zi, ta sẽ<br /> có bài toán hồi quy tuyến tính: g = k + bt +<br /> z11 + z22 + ... + zm-1m-1.<br /> Hồi quy đa thức<br /> Hàm hồi quy đa thức có dạng: y = a0 + a1t1 +<br /> a2t2 + ... + antn<br /> (4)<br /> <br /> 122(08): 129 - 135<br /> <br /> Trong đó các ai (i = 0, 1 ... n ) là các hằng số<br /> cần xác định, t là biến thời gian.<br /> Để xác định các ai (i=0 ... n) từ số liệu thực<br /> nghiệm ta đưa (4) về bài toán hồi quy tuyến<br /> tính bằng phép đổi biến: x1 = t, x2 = t2 , ... , xn<br /> = tn, từ đó ta có được bài toán hồi quy tuyến<br /> tính bội.<br /> Nhiều bài toán hồi quy phi tuyến khác có thể<br /> được giải bằng cách chuyển về bài toán hồi quy<br /> tuyến tính mà vẫn đảm bảo tính chính xác [8].<br /> Phương pháp giải một số bài toán hồi quy<br /> phi tuyến<br /> Trong phần trên chúng ta đã đưa ra một số<br /> dạng trong lớp bài toán hồi quy phi tuyến, để<br /> giải các bài toán đó chúng ta có thể chuyển<br /> chúng về dạng bài toán hồi quy tuyến tính, cụ<br /> thể thực hiện các bước như sau:<br /> Tuyến tính hoá bài toán phi tuyến: Chuyển dữ<br /> liệu của bài toán phi tuyến về dạng áp dụng<br /> được cho bài toán tuyến tính.<br /> Giải bài toán hồi quy tuyến tính với dữ liệu<br /> của bài toán phi tuyến đã được chuyển đổi<br /> phù hợp.<br /> Trả lại các thông số cho bài toán hồi quy<br /> phi tuyến.<br /> Trong phần tiếp theo chúng tôi sẽ đề xuất mô<br /> hình giải các bài toán hồi quy như đã trình<br /> bày ở trên theo mẫu thiết kế Strategy.<br /> THIÊT KẾ MÔ HÌNH GIẢI MỘT SỐ BÀI<br /> TOÁN HỒI QUY THEO MẪU THIẾT KẾ<br /> Mô hình giải các bài toán hồi quy theo mẫu<br /> Chiến lược trong ngôn ngữ C# được chúng tôi<br /> thiết kế như trên hình vẽ 2. Trong đó:<br /> IRegression là giao diện (interface) xác định<br /> các dịch vụ phục vụ cho việc giải các bài toán<br /> hồi quy tuyến tính theo yêu cầu.<br /> Linear_Regression là lớp thực thi của giao<br /> diện IRegression, các phương thức đã khai<br /> báo trong IRegression sẽ được thực hiện trong<br /> lớp này.<br /> NonLine_Regressioni (ở đây i = 1 .. 3): là<br /> các lớp con, được kế thừa từ<br /> Linear_Regression, mỗi lớp con này sẽ thực<br /> 131<br /> <br /> Nguyễn Mạnh Đức<br /> <br /> Tạp chí KHOA HỌC & CÔNG NGHỆ<br /> <br /> hiện việc giải một bài toán hồi quy phi tuyến<br /> tính theo yêu cầu.<br /> Context: Tại thời điểm biên dịch chỉ sử dụng<br /> đối tượng kiểu IRegression xác định giải thuật<br /> cho vấn đề cần giải bài toán hồi quy; Tại thời<br /> điểm thực thi được cung cấp một đối tượng<br /> giải thuật cụ thể thay thế cho đối tượng<br /> IRegression để giải một bài toán hồi quy phi<br /> tuyến cụ thể.<br /> Các phương thức trong giao diện được khai<br /> báo như sau:<br /> interface IRegression<br /> {<br /> void INPUT_DATA();<br /> void DISPLAY();<br /> void EDIT_DATA();<br /> void GET_DATA();<br /> void TRANSLATE();<br /> void SLOVE();<br /> void TEST();<br /> <br /> }<br /> Phần thân của chúng sẽ được định nghĩa trong<br /> lớp Linear_Regression, trong đó:<br /> void INPUT_DATA(): Nhập dữ liệu cho<br /> bài toán;<br /> void DISPLAY(): Hiển thị các thông<br /> cũng như kết quả xử lý;<br /> void EDIT_DATA(): Sửa dữ liệu khi cần;<br /> void GET_DATA(): Lấy dữ liệu từ tệp<br /> cho bài toán;<br /> void TRANSLATE(): Chuyển đổi dữ liệu<br /> cho bài toán;<br /> void SLOVE(): Giải bài toán hồi quy<br /> tuyến tính;<br /> void TEST(): Kiểm định các giả thuyết…<br /> Việc thực thi các phương thức của<br /> interface IRegression được thực<br /> hiện trong lớp Linear_Regression để<br /> giải bài toán hồi quy tuyến tính được xác định<br /> như sau:<br /> class<br /> Linear_Regression<br /> :<br /> IRegression<br /> <br /> Hình 2: Biểu đồ UML của mô hình bài toán<br /> <br /> 132<br /> <br /> 122(08): 129 - 135<br /> <br /> Nguyễn Mạnh Đức<br /> <br /> Tạp chí KHOA HỌC & CÔNG NGHỆ<br /> <br /> {<br /> public void INPUT_DATA()<br /> {<br /> ...//Nhập dữ liệu<br /> }<br /> public void DISPLAY()<br /> {<br /> ...//Hiển thị t.tin<br /> }<br /> public void EDIT_DATA()<br /> {<br /> ... //Sửa dữ liệu<br /> }<br /> public void GET_DATA()<br /> {<br /> ...//Đọc dữ liệu từ tệp<br /> }<br /> public<br /> virtual<br /> void<br /> TRANSLATE()<br /> {<br /> ...//Chuyển dữ liệu<br /> }<br /> public virtual void SLOVE()<br /> {<br /> ...//Giải bài toán HQTT<br /> }<br /> public virtual void TEST()<br /> {<br /> ...//Kiểm thử bài toán<br /> }<br /> }<br /> Cần chú ý rằng các phương thức<br /> TRANSLATE(), SLOVE(), TEST()<br /> phải là ảo (virtual) vì chúng cần phải được<br /> ghi đè trong các lớp hậu duệ (kế thừa) của lớp<br /> Linear_Regression để xử lý cho các bài<br /> toán hồi quy phi tuyến.<br /> Các lớp NonLine_Regressioni (i=1..3)<br /> được cài đặt như sau:<br /> class NonLinear_Regressioni<br /> Linear_Regression<br /> <br /> :<br /> <br /> {<br /> public<br /> override<br /> TRANSLATE() {...}<br /> <br /> void<br /> <br /> 122(08): 129 - 135<br /> <br /> public<br /> TEST() {...}<br /> <br /> override<br /> <br /> void<br /> <br /> public<br /> SLOVE()<br /> <br /> override<br /> <br /> void<br /> <br /> {<br /> TRANSLATE();<br /> base.SLOVE();<br /> }<br /> }<br /> Trong đó phương thức TRANSLATE()để<br /> biến đổi dữ liệu bài toán phi tuyến thành dữ<br /> liệu cho bài toán tuyến tính, TEST() để kiểm<br /> thử cho bài toán, phương thức SLOVE() sẽ gọi<br /> thức TRANSLATE()để lấy dữ liêu phù hợp<br /> cho bài toán tuyến tính, rồi gọi phương thức<br /> SLOVE() ở lớp cơ sở của chúng.<br /> Lớp NonLine_Regression1 để giải bài<br /> toán<br /> hồi<br /> quy<br /> dạng<br /> mũ,<br /> lớp<br /> NonLine_Regression2 để giải bài toán<br /> Cobb<br /> Douglas<br /> tổng<br /> quát,<br /> lớp<br /> NonLine_Regression3 để giải bài toán<br /> hồi quy đa thức. Trong các lớp này các tên<br /> của các phương thức là giống nhau, nhưng<br /> nội dung của chúng là khác nhau tùy thuộc<br /> vào mỗi bài toán.<br /> Lớp context được cài đặt như sau:<br /> class Context<br /> {<br /> IRegression ihq;<br /> public Context(IRegression<br /> ihq)<br /> {<br /> this.ihq = ihq;<br /> }<br /> public<br /> void<br /> ContextInterface()<br /> {<br /> this.ihq.GET_DATA();<br /> this.ihq.SLOVE();<br /> this.ihq.TEST();<br /> }<br /> ...//các thành phần khác<br /> }<br /> Khi đó một lớp Client với hàm Main có<br /> thể dễ dàng gọi các đối tượng cần thiết cho<br /> 133<br /> <br />
ADSENSE
ADSENSE

CÓ THỂ BẠN MUỐN DOWNLOAD

 

Đồng bộ tài khoản
2=>2