Tải bản đầy đủ (.docx) (34 trang)

tìm mô hình hóa dữ liệu bằng phương pháp bình phương tối thiểu và thuật toán giảm gradient

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (535.53 KB, 34 trang )

Báo cáo đồ án tính toán, HK1 năm học 2019-2020

Điểm
(dành cho
GV ghi)

Bảng phân công nhiệm vụ
(SV ghi càng cụ thể thì GV càng dễ đặt câu hỏi và cho điểm
mỗi SV)
Hoàng Thị
xoan

Đọc tài liệu, cài đặt và viết báo cáo về thuật
toán phương pháp bình phương tối thiểu

Nguyễn Thị
Nga

Đọc tài liệu, cài đặt và viết báo cáo về thuật
toán giảm Gradient

Chữ ký của SV
(mỗi SV ký xác
nhận trước khi
nộp báo cáo)


Nhóm , lớp HP: 1816

MỤC LỤC
DANH MỤC HÌNH ẢNH...........................................................................................................2


DANH MỤC BẢNG..................................................................................................................2
ĐẶT VẤN ĐỀ...........................................................................................................................3
CHƯƠNG 1. CƠ SỞ LÝ THUYẾT...............................................................................................5
1.1. GIỚI THIỆU TÌM MÔ HÌNH TUYẾN TÍNH CỦA TẬP DỮ LIỆU.............................................5
1.1.1. Lý thuyết [1]...................................................................................................................5
1.1.2. Phân tích bài toán..........................................................................................................5
1.2. PHƯƠNG PHÁP BÌNH PHƯƠNG TỐI THIỂU[2]...............................................................7
1.2.1. Nghiệm của thuật toán hồi quy tuyến tính một biến....................................................7
1.2.2.Tóm tắt thuật toán..........................................................................................................8
1.3. THUẬT TOÁN GIẢM GRADIENT......................................................................................8
CHƯƠNG 2. PHÂN TÍCH THIẾT KẾ HỆ THỐNG........................................................................12
2.1. PHƯƠNG PHÁP BÌNH PHƯƠNG TỐI THIỂU..................................................................12
2.1.1. Thuật toán....................................................................................................................12
2.1.2. Chương trình C++.........................................................................................................12
2.2.THUẬT TOÁN GIẢM GRADIENT.....................................................................................22
2.2.1. Thuật toán....................................................................................................................22
2.2.2. Chương trình C++.........................................................................................................23
CHƯƠNG 3. TRIỂN KHAI VÀ ĐÁNH GIÁ KÊT QUẢ...................................................................29
3.1. MÔ TẢ DỮ LIỆU...........................................................................................................29
3.2. PHƯƠNG PHÁP BÌNH PHƯƠNG TỐI THIỂU..................................................................30
3.3. THUẬT TOÁN GIẢM GRADIENT....................................................................................32
3.3.1. Điểm khởi tạo khác nhau.............................................................................................32
3.3.2.Learning rate () khác nhau............................................................................................33
3.3.3. Giới hạn dưới khác nhau..............................................................................................34
KẾT LUÂN CHUNG.................................................................................................................35
TÀI LIỆU THAM KHẢO...........................................................................................................35

Page 2



Hoàng Thị Xoan, Nguyễn Thị Nga

DANH MỤC HÌNH ẢNH
Hình 1: Biểu diễn mối liên hệ diện tích và giá nhà khi không có yếu tố bên ngoài tác động........4
Hình 2: Biểu diễn mối liên hệ diện tích và giá nhà khi có yếu tố bên ngoài tác động...................4
Hình 3: Mối quan hệ giữa giá trị dự đoán và giá trị thực tế...........................................................5
Hình 4: Khoảng sai số....................................................................................................................6
Hình 5: Kết quả bài toán.................................................................................................................7
Hình 6: Mô hình hồi quy tuyến tính...............................................................................................8
Hình 7: Minh họa của Gradient......................................................................................................9
Hình 8: Biểu diễn lặp của Gradient..............................................................................................10
Hình 9: Biểu diễn Learning rate cho từng trường hợp[3].............................................................10
Hình 10: Sự khác nhau cho từng vị trí chọn ban đầu....................................................................11
Hình 11: Đồ thị phân bố dữ liệu của 15 mẫu ở bảng 2.................................................................30
Hình 12: Kết quả dự đoán của 10 mẫu dữ liệu ở bảng 2..............................................................31
Hình 13: Kết quả dự đoán của 15 mẫu dữ liệu ở bảng 2..............................................................31
Hình 14: Đồ thị hàm mất mát với w0 = w1 = -10........................................................................33
Hình 15: Đồ thị hàm mất mát với w0 = w1 = 0............................................................................33
Hình 16: Đồ thị hàm mất mát với = 1e-5, w0 = w1 = 0, = 1e-6.................................................34
Hình 17: Đồ thị hàm mất mát với = 6, w0 = w1 = 0, = 1e-6......................................................34

DANH MỤC B
Y
Bảng 1: Dữ liệu đầu vào gồm 20 mẫu được sinh từ phương trình y=3*x-4 với x=rand(20,1);. .30
Bảng 2: Dữ liệu đầu vào về chiều cao và cân nặng của 15 người [2]..........................................30
Bảng 3: Bảng kết quả tìm được với mỗi giá trị khác nhau từ dữ liệu bảng 1 với = 1e-2, giá trị
khởi tạo w0 = w1 = 0.........................................................................................................................33
Bảng 4: Bảng kết quả tìm được với mỗi giá trị khác nhau từ dữ liệu bảng 2 với = 1e-5, giá trị
khởi tạo w0 = w1 = -34.....................................................................................................................33
Bảng 5: Bảng so sánh ưu, nhược điểm của hai phương pháp.......................................................37


ĐẶT VẤN ĐỀ

Page 3


Nhóm , lớp HP: 1816
Hồi quy tuyến tính hay nói là “Linear Regression” là một trong những chủ đề nổi tiếng nhất
trong thống kê và đặc biệt trong Machine Learning. Trước khi đến với định nghĩa rõ ràng về hồi
quy tuyến tính chúng ta hãy nói về 1 ví dụ mà bạn rất hay gặp trong cuộc sống:
Ví dụ: Ta có ngôi nhà x1 có diện tích là y1 () được bán với giá là s1(đ) và nếu chúng ta có số liệu
thông kê của 1000 ngôi nhà với diện tích và giá bán,giả sử rằng ngôi nhà với diện tích lớn thì sẽ
được bán với giá cao hơn thì liệu khi có thêm 1 ngôi nhà mới với diện tích biết trước thì chúng ta
có thể dự đoán được giá bán của nó không ?
Từ ví dụ trên chúng ta cũng có thể hiểu sơ qua được 1 phần về hồi quy tuyến tính. Hồi quy
tuyến tính là 1 thuật toán trong Machine Learning cho phép chúng ta ánh xạ đầu vào số thành đầu
ra số khớp một dòng điểm dữ liệu, bạn có thể nhìn hình bên dưới các điểm màu xanh là các tượng
trưng cho các ngôi nhà với diện tích và giá bán được biết trước, điểm màu đỏ là điểm chúng ta
cần dự đoán giá bán, để trực quan mình đã vẽ 1 đường thằng đi qua tất cả các điểm màu xanh từ
đó ta có thể dễ dàng nhận thấy và dự đoán được giá bán của ngôi nhà mới tượng trưng là điểm
màu đỏ.

Hình 1: Biểu diễn mối liên hệ diện tích và giá nhà khi không có yếu tố bên ngoài tác động
Từ ví dụ trên chúng ta cũng có thể hiểu sơ qua được 1 phần về hồi quy tuyến tính. Hồi quy
tuyến tính là 1 thuật toán trong Machine Learning cho phép chúng ta” khớp” một tập điểm dữ
liệu. Nhưng trong thực tế thì không phải như vậy mà giá nhà còn phụ thuộc vào nhiều yếu tố
khác như số phòng,thời điểm,nhà có ở “mặt đường “ hay không. Vậy làm sao ta tìm được giá bán
ngôi nhà khi có một ngôi nhà mới thê vào.

Hình 2: Biểu diễn mối liên hệ diện tích và giá nhà khi có yếu tố bên ngoài tác động

Trong báo cáo này sẽ trình bày hai phương pháp đó là phương pháp bình phương tối thiểu và
phương pháp giảm gradient
CHƯƠNG 1. CƠ SỞ LÝ THUYẾT

Page 4


Hoàng Thị Xoan, Nguyễn Thị Nga

1.1. GIỚI THIỆU TÌM MÔ HÌNH TUYẾN TÍNH CỦA TẬP DỮ LIỆU
1.1.1. Lý thuyết [1]
Hồi quy tuyến tính là một phương pháp tối ưu hóa để lựa chọn một đường thể hiện gần đúng
nhất cho một tập dữ liệu ứng với cực trị của tổng các sai số thống kê (error) giữa đường khớp và
dữ liệu". Tính tổng khoảng cách giữa giá trị dự đoán và giá trị thực tế của từng điểm dữ liệu sao
cho nhỏ nhất

Hình 3: Mối quan hệ giữa giá trị dự đoán và giá trị thực tế

Giả sử dữ liệu gồm các điểm vói i=1, 2,…..,n. Chúng ta cần tìm một hàm f thỏa mãn :
f () yi
Giả sử hàm f có thể thay đổi hình dạng phụ thuộc vào một bộ tham số w
f(x) = f (pj, x)
Nội dung của phương pháp này là tìm giá trị của tham số pj sao cho biểu thức sau đạt cực tiểu:
(1)

1.1.2. Phân tích bài toán
Quay lại ví dụ đã nêu trước ta đã cho rằng giá nhà chỉ phụ thuộc vào diện tích nhưng thực tế
giá nhà còn phụ thuộc vào nhiều yếu tố khác như vị trí thời điểm, số phòng,…..,n .như vậy hàm
f(x) sẽ có dạng như thế nào .một hàm số đơn giản nhất nhất có thể mô tả mối quan hệ giữa giá
nhà và n đại lượng đầu vào là:

)=
++++……..+

Trong đó:



{ } là các tham số.
x=[] là một vector hàng chứa thông tin đã biết(diện tích ,vị trí,thời diểm,…..vv)
Page 5


Nhóm , lớp HP: 1816



y là giá trị thực cần tìm dựa trên dữ liệu (tức là giá của căn nhà trong ví dụ này)

Trong trường hợp tổng quát input gồm n biến thì thuật toán tìm ra phương trình trên được
gọi là linear regression n biến. Nhưng trong bài báo này thì chúng ta chỉ xét linear regression 1
biến .khi đó f(x) sẽ có dạng như sau:
)== +=
+Với =

và x=

 Mục tiêu của bài toán này là đi tìm các hệ số tối ưu {để cho y và có sự khác nhay rất nhỏ.
 Số 1 ở đầu được thêm vào để phép tính đơn giản hơn và thuận tiện cho việc tính toán.
Chúng ta không tìm đường thẳng đi qua tất cả các điểm cho trước được (trừ khi chúng thẳng
hàng).Do vậy mỗi phương trình luôn có sự mất mát nhất định. Độ lớn của sự mất mát phụ thuộc

các tham số ().
Như vậy chúng ta muốn sự sai khác e giữa giá trí thực y và giá trị đự đoán là nhỏ nhất. Nói cách
khác chúng ta muốn giá trị sau đây càng nhỏ càng tốt

 Trong đó hệ số là để thuận tiện cho việc tính toán(khi đạo hàm sẽ bị triệt tiêu )

Hình 4: Khoảng sai số
Điều chúng ta muốn, tổng sai số là nhỏ nhất, tương đương với việc tìm để hàm số sau đạt giá
trị nhỏ nhất.
=
=
=

Trong đó n là số giá trị ban đầu được dùng để huấn luyện thuật toán.
Ký hiệu có nghĩa là giá trị biến của giá trị vào thứ i trong bộ giá trị vào ban đầu để huấn luyện
thuật toán. Các quy ước về ký hiệu này sẽ được sử dụng mặc định từ giờ trở đi.
Hàm số được gọi là hàm mất mát(loss function) của bài toán linear regression .Chúng ta luôn
mong rằng sự mất mát(sai số) là nhỏ nhất điều đó đồng nghĩa với việc tìm vector hệ số sao cho
giá trị của hàm mất mát này càng nhỏ nhất . Chúng ta sẽ đi tìm giá trị của w làm làm cho hàm

Page 6


Hoàng Thị Xoan, Nguyễn Thị Nga
mất mát đạt giá trị nhỏ nhất.Có 2 phương pháp để tìm đó là phương pháp bình phương tối
thiểu và phương pháp Gradient Descent

1.2. PHƯƠNG PHÁP BÌNH PHƯƠNG TỐI THIỂU[2]
1.2.1. Nghiệm của thuật toán hồi quy tuyến tính một biến
Ta còn có thể đơn giản hóa hàm mất mát hơn nữa bằng cách :

Đặt X= là ma trận với mỗi hàng là một input (hàng i ứng với)
Đặt y= là vector các output thì hàm mất mát được viết lại thành =

Hình 5: Kết quả bài toán
Việc tìm nghiệm của thuật toán hồi quy tuyến tính một biến chính là tìm ra tham số = để hàm
có giá trị nhỏ nhất.
Cách phổ biến nhất để tìm nghiệm cho bài toán tối ưu là giải phương trình đạo hàm .
Trước khi đi tìm nghiệm thì chúng ta cần phải đơn giản hóa phép toán trong phương trình mất
mát(2).
Khi đó hàm số mất mát được viết dưới dạng ma trận đơn giản hơn:
=

(2)

Ký hiệu là độ dài của vector
Đạo hàm theo của hàm (2) ta được:
L’() =(
là một ma trận vuông và nó khả nghịch ,cho L’(w)=0 ta có được cong thức:
=

(3)

1.2.2.Tóm tắt thuật toán
Yêu cầu :Cho trước n bộ dữ liệu tạo thuật toán.Bộ dữ liệu thứ I chứa input và output ,trong
đó input thứ i chỉ chứa một biến duy nhất . Nhiệm vụ của chúng ta là đi tìm mối quan hệ giữa
Page 7


Nhóm , lớp HP: 1816
input và output bằng một hàm tuyến tính để khi đưa vào một input mới ,ta có thể dự đoán được

output ứng với nó:
= +

Hình 6: Mô hình hồi quy tuyến tính

Page 8


Hoàng Thị Xoan, Nguyễn Thị Nga

1.3. THUẬT TOÁN GIẢM GRADIENT
Trong các bài toán Machine learning hoặc các bài toán tối ưu, chúng ta thường phải làm việc
với những điểm cực trị (thường là điểm cực tiểu) của một hàm số. Trong mục 1.2 chúng ta đã đi
dữ đoán giá nhà bằng phương pháp bình phương tối thiểu, chúng ta đã phải cố gắng tìm giá trị
nhỏ nhất của hàm chi phí (cost function) mà đôi khi còn gọi là hàm mất mát (loss function).
Vậy Thuật toán Gradient là gì? Gradient có liên hệ gì với việc tìm kiếm cực trị bài toán tối ưu?
Chúng ta sẽ cùng tìm hiểu trong phần này.
Trong kiến thức toán phổ thông chúng ta đã biết, muốn tìm cực trị một hàm số chúng ta sẽ giải
phương trình đạo hàm của hàm số bằng 0.

Tuy nhiên phương trình trên không phải lúc nào cũng giải được dễ dàng, có những trường hợp
việc giải phương trình trên là bất khả thi.
=> Vậy khi gặp những tình huống này, chúng ta phải làm gì?
May thay, thuật toán Gradient cho chúng ta cách thức tìm các điểm cực tiểu cục bộ này một
cách xấp xỉ sau một số vòng lặp.
Trong thực tế, các giá trị dữ liệu không có đúng 100% mà đôi khi chúng ta chỉ cần những con số
gần đúng.
Thuật toán Gradient dùng để tìm điểm cực trị của hàm số

Hình 7: Minh họa của Gradient

Để hiểu rõ hơn thì ta lấy một ví dụ như sau :
Ví dụ: Quả bóng đang lăn xuống dốc. Trong một môi trường vật lý mà ta giả định thì quả bóng
lăn xuống càng nhanh khi dốc càng đứng (mặc dù không phải vậy) và khi xuống đến chân dốc thì
quả bóng dừng lại.
Hiện tượng này rất dễ hình dung và giúp bạn hiểu quy trình của Gradient.
Xét hàm số y = f(x) và ta cần tìm điểm cực tiểu của hàm số.Một cách hình ảnh, khi f’(x) > 0 thì
đồ thị dốc sang trái, x có xu hướng giảm để "xuống dốc"; khi f’(x) < 0 thì đồ thị dốc sang phải, x có

Page 9


Nhóm , lớp HP: 1816
xu hướng tăng cũng để "xuống dốc"; khi f’(x) = 0 thì x nằm ở "chân dốc" và ta tìm được điểm cực
tiểu của hàm số.
Xuất phát từ điểm x bất kỳ, ta cần điều chỉnh x để nó có xu hướng tiến về điểm mà hàm số đạt
cực tiểu. Điều này có thể đạt được bằng cách lặp lại liên tiếp phép biến đổi
x=x-f’(x)

(4)

Hình 8: Biểu diễn lặp của Gradient
Thông thường, ta không thể thực hiện phép lặp đến khi f'(x) = 0 được mà khi |f'(x)| rất nhỏ ta
coi như đã tìm được điểm cực tiểu.
Trong phép biến đổi trên, α được gọi là learning rate. Learning rate càng lớn thì mỗi "bước
nhảy" của x sẽ càng lớn và số lần lặp cần thiết để tìm được điểm cực tiểu sẽ giảm đi. Tuy nhiên
nếu learning rate quá lớn thì có thể sau mỗi lần lặp x càng cách xa điểm cực tiểu và ta không thể
tìm được điểm cực tiểu.

 Learning_rate () là gì?
Learning rate: là đại lượng dùng để điều chỉnh tốc độ học của máy.

Việc chọn hệ số learning_rate cực kì quan trọng, có 3 trường hợp:


Nếu learning_rate quá nhỏ: mỗi lần hàm số giảm rất ít nên cần rất nhiều lần thực hiện
bước 2 để hàm số đạt giá trị nhỏ nhất



Nếu learning_rate hợp lý: sau một số lần lặp bước 2 vừa phải thì hàm sẽ đạt giá trị đủ nhỏ.



Nếu learning_rate quá lớn: sẽ gây hiện tượng vượt quá (overshoot) và không bao giờ đạt
được giá trị nhỏ nhất của hàm.

Hình 9: Biểu diễn Learning rate cho từng trường hợp[3]

Page 10


Hoàng Thị Xoan, Nguyễn Thị Nga
Vì lý do đó việc chọn learning rate phù hợp là rất quan trọng. Ta có thể thử nhiều giá trị
learning rate khác nhau để tìm ra giá trị learning rate đủ tốt (chứ không cần phải tốt nhất).
Thuật toán giảm Gradient dùng để tìm ra điểm mà hàm số đạt cực tiểu chứ không phải đạt giá
trị nhỏ nhất. Đối với hàm số có nhiều cực tiểu thì tùy thuộc vào vị trí điểm chọn ban đầu, ta có thể
tìm được kết quả khác nhau.

Hình 10: Sự khác nhau cho từng vị trí chọn ban đầu
Trong hình ở trên, nếu ta xuất phát từ vị trí thứ nhất thì thuật toán sẽ dừng lại khi di chuyển
đến A, nếu xuất phát từ vị trí thứ hai thì thuật toán dừng lại tại B, nếu xuất phát từ vị trí thứ ba thì

thuật toán dừng lại tại C.
Đối với thuật toán hồi quy tuyến tính, thật may mắn khi hàm mất mát của nó chỉ có một cực
tiểu. Do đó ta có thể dùng giảm Gradient để tìm điểm cực tiểu đó cũng chính là điểm mà hàm mất
mát đạt giá trị nhỏ nhất.

Page 11


Nhóm , lớp HP: 1816

CHƯƠNG 2. PHÂN TÍCH THIẾT KẾ HỆ THỐNG

2.1. PHƯƠNG PHÁP BÌNH PHƯƠNG TỐI THIỂU
2.1.1. Thuật toán
Input : Nhập vào:
+ Ma trận với mỗi hàng là một input X
+ Vector chứa giá trị thực dựa trên dữ liệu y
Output:
Bước 1:
- Nhập ma trân A với mỗi hàng là một dữ liệu của input x
-Nhập ma trân B với mỗi hàng là một giá trị thực của dữ liệu y

Bước 2: thiết lập các ma trận và vector dưới đây
w=
X=
y=
Bước 3: vector được tính bằng công thức:
=

2.1.2. Chương trình C++

#include<iostream>
#include<math.h>
#include<fstream>
#include<iomanip>
#include <stdlib.h>
#define max 100
using namespace std;
// THEM MOT HANG VAO MA TRAN
Page 12


Hoàng Thị Xoan, Nguyễn Thị Nga

float them(float X1[max][max],int n,int m,float a[max][max])
{
int i,j,k;
cout<<"\n chen 1 hang vao ma tran";
cout<<"\nNhap hang can chen:k=";cin>>k;
for(i=n;i>k-2;i--)
{
for(j=0;j{
X1[i+1][j]=a[i][j];
}
}
for(j=0;j{
X1[k-1][j]=1;
}
}

// HAM TINH DINH THUC CUA MA TRAN
float tinhdet(float X[][max], int n) {
float c[max][max];
for (int r = 0; r < n; r++) {
for (int t = 0; t < n; t++){
c[r][t] = X[r][t];
}
}
for (int i = 0; i < n - 1; i++){
int j = i;
while (c[j][i] == 0) {
j++;
}
if (j != i) {
for (int k = 0; k < n; k++) {
Page 13


Nhóm , lớp HP: 1816

float A = c[i][k];
c[i][k] = c[j][k];
c[j][k] = A;
}
}
for (int p = i + 1; p < n; p++) {
if (c[p][i] == 0) continue;
if (c[p][i] != 0) {
float m = -c[p][i] / c[i][i];
for (int q = i; q < n; q++)

{
c[p][q] = c[p][q] + (c[i][q] * m);
}
}
}
}
float d = 1;
for (int w = 0; w < n; w++) {
d = d * c[w][w];
}
return d;
}
// TIM MA TRAN PHU HOP
void phuhop(float X[][max], int n) {
float c[max][max];
for (int r = 0; r < n; r++) {
for (int t = 0; t < n; t++) {
c[r][t] = X[r][t];
}
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
Page 14


Hoàng Thị Xoan, Nguyễn Thị Nga

float x[max][max];
for (int H = 0; H < n - 1; H++) {
int h = H;

if (h >= i) h = h + 1;
for (int K = 0; K < n - 1; K++) {
int k = K;
if (K >= j) k = k + 1;
x[H][K] = c[h][k];
}
}
int s = pow((-1), (i + j));
X[i][j] = s * tinhdet(x, n - 1);
}
}}
// HAM CHUYEN VI CUA MA TRAN
void chuyenvi(float A[][max], int n, int m, float A1[][max])
{
for (int j = 0; j < m; j++) {
for (int i = 0; i < n; i++) {
A1[j][i] = A[i][j];
}
}
}
// HAM NHAN 2 MA TRAN
void nhanmt(float a[max][max], int n, int m, float f[max][max], float T[][max], int m1)
{
float sum;
for (int i = 0; i < n; i++) { // n: so dong cua ma tran a
for (int j = 0; j < m1; j++) // m1 la so cot cua ma tran f
{
sum = 0;
for (int k = 0; k < m; k++) // m so dong cua ma tran f
Page 15



Nhóm , lớp HP: 1816

{
sum += a[i][k] * f[k][j];
}
T[i][j] = sum;
}
}
}
// HAM TIM MA TRAN KHA NGHICH
void khanghic(float a[][max], int n, float d)
{
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
a[i][j] = a[i][j] * (1 / d);
}
}
}
//HAM DU DOAN KET QUA
void dudoan(float W[][max],int n,int m,float A[][max],float kqdd[][max])
{
for(int i=0;ifor(int j=0;jkqdd[i][j]= W[1][0] * A[i][j] + W[0][0];
}
}
}
// HAM TIM SAI SO GIUA GIA TRI DU DOAN VA GIA TRI THUC

float ERR(int n,int m,float err[max][max],float kqdd[max][max],float B[max][max])
{
float tt;
for(int i=0;ifor(int j=0;jerr[i][j]= (kqdd[i][j]-B[i][j]);
Page 16


Hoàng Thị Xoan, Nguyễn Thị Nga

}
}
}
int main()
{ //doc file du lieu x.txt
ifstream File;
File.open("C:\\Users\\shin\\Desktop\\cotx.txt", ios_base::in);
float A[max][max];
int n, m;
cout << "So hang cua ma tran A=";
cin >> n;
cout << "So cot cua ma tran A=";
cin >> m;
for (int i = 0; i < n; i++)
{
for (int j = 0; j < m; j++)
{
File >> A[i][j];
}

}
cout<<"du lieu chieu cao \n ";
for (int i = 0; i < n; i++)
{
for (int j = 0; j < m; j++)
{
cout<< A[i][j]<<" ";
}
cout<<"\n";
}
//doc file du lieu y.txt
ifstream Filetien;
Filetien.open("C:\\Users\\shin\\Desktop\\coty.txt", ios_base::in);
Page 17


Nhóm , lớp HP: 1816

float B[max][max];
int n1, m1;
cout << "So hang cua ma tran B=";
cin >> n1;
cout << "So cot cua ma tran B=";
cin >> m1;
for (int i = 0; i < n1; i++)
{
for (int j = 0; j < m1; j++)
{
Filetien >> B[i][j];
}

}
cout<<"Du lieu can nang \n";
for(int i=0;i{
for(int j=0;j{
cout<}
cout<<"\n";
}

float X1[max][max];
them(X1,n,m,A); // X1 la ma tran sau khi them mot cot
int z;

// z la so hang cua ma tran sau khi them

z=n+1;
float X[max][max];
chuyenvi(X1,z,m,X); // X la ma tran chuyen vi cua X1
float Y[max][max];
chuyenvi(B,n1,m1,Y);

// Y la ma tran chuyen vi cua B

float L[max][max];
Page 18


Hoàng Thị Xoan, Nguyễn Thị Nga


nhanmt(X1,z,m1,Y,L,n1); //ma tran L= X^-1 * Y
float T[max][max];
nhanmt(X1,z,m,X,T,z); // ma tran T= X^-1 * X
//z la so hang cua X1
//m la so cot cua X1;z la so cot cua X;
float d=tinhdet(T,z);
phuhop(T, z);
khanghic(T, z, d);

// kha nghich
//tinh ma tran nghich dao T^-1

float W[max][max];
nhanmt(T,z,z,L,W,n1); // W=T * L
cout<<" KET QUA :\n";
if(W[0][0]>0)
cout<<"\t y="<else cout<<" \t y="<cout<<"\n";
float kqdd[max][max];
dudoan(W,n,m,A,kqdd);//du doan ket qua
float err[max][max];
ERR(n,m,err,kqdd,B);// tim sai so giua gia tri du doan va gia tri thuc
cout<<"stt"<cout<<"dudoan"<cout<<"-----------------------------------------------------------------\n";
for (int i=0;i{
for(int j=0;j

{
cout<cout<}
}
// tinh sai so du doan tren tap du lieu
float ss=0,M=0;
Page 19


Nhóm , lớp HP: 1816

for(int i=0;i{
for(int j=0;j{
ss+=kqdd[i][j]-B[i][j];
M++;
}
}
cout<<"\n SAI SO DU DOAN TREN TAP DU LIEU \n";
float MSE;
MSE=sqrt((double)pow(ss,2)/M);
cout<<"MSE="<return 0;
}

2.2.THUẬT TOÁN GIẢM GRADIENT
2.2.1. Thuật toán
Cho hàm số:[4]

L(w) =
=
Input: Nhập vào:
+ Dữ liệu vào là vector x,y
+ Giá trị ban đầu
+ Learning rate α
+ Giá trị
+ Giới hạn số vòng lặp N
Output: Xuất ra:
+ kết quả: ,
Bước 1: Chọn một điểm bất kì ( và một giá trị learning rate α
Bước 2: Liên tiếp lặp các phép biến đổi:
với j=;
Page 20


Hoàng Thị Xoan, Nguyễn Thị Nga
Tương ứng ta có:


Bước 3: Thuật toán dừng lại khi trị L(w) thay đổi rất nhỏ (. Nếu thuật toán lặp quá N vòng thì
chọn giá trị α nhỏ hơn rồi quay lại bước 2.

Page 21


Nhóm , lớp HP: 1816

2.2.2. Chương trình C++
#include <iostream>

#include <math.h>
#include <fstream>
#include <iomanip>
using namespace std;
/*HAM DU LIEU DAU VAO*/
void Intput(float x[], float y[], int n )
{
float data[1001][2];
ifstream doan("doan1.txt");
//doc du lieu tu file
for(int i = 0; i < n; i++)
{
for(int j = 0; j < 2; j++)
{
doan >> data[i][j];
}
}
//xuat du lieu tu file
cout << "\nNhap X:" << endl;
for(int i = 0; i < n; i++)
{
x[i] = data[i][0];
cout << x[i] << " ";
}
cout << "\nNhap Y:" << endl;
for(int i = 0; i < n; i++)
{
y[i] = data[i][1];
cout << y[i] << " ";
}

Page 22


Hoàng Thị Xoan, Nguyễn Thị Nga

//dong file
doan.close();
}
/* HAM TRỊ TUYET DOI */
float fab(float a)
{
if(a >= 0)
return a;
else
return (-1)*a;
}
/* HAM GRADIENT */
void Gradient(float x[], float y[], int n, float alpha, float w0, float w1, float esp, int N)
{
float L[N], Y[1001], ss[1001], MSE=0;
float dh0 = 1, dh1 = 1;
L[0] = 0; L[1] = 1;

int k = 1;
while(k <= N && fab(L[k]-L[k-1]) > esp)
{
k++;
/* Ham mat mat */
L[k] = 0;
for(int i = 0; i < n; i++)

{
L[k] += (pow((w0 + w1 * x[i]) - y[i],2));
}
L[k] /= (2*n);

/* Tinh gia tri dao ham rieng doi voi w0 */
dh0 = 0;
Page 23


Nhóm , lớp HP: 1816

for(int i = 0; i < n; i++)
{
dh0 += ((w0 + w1 * x[i]) - y[i]);
}
dh0 /= n;

/* Tinh gia tri dao ham rieng doi voi w1 */
dh1 = 0;
for(int i = 0; i < n; i++)
{
dh1 += (((w0 + w1 * x[i])- y[i]) * x[i]);
}
dh1 /= n;
/* Cap nhat lai gia tri */
w0 = w0 - (alpha * dh0);
w1 = w1 - (alpha * dh1);

/* Xuat cac gia tri */

cout << fixed;//ki hieu dau phay dong co dinh
cout << setprecision(5);
cout << "Vong lap thu " << k-1 << ": \tw0 = " <if(w0 > 0)
{
cout << "\t\ty = " << w1 << "x + " << w0 << endl;
}
Page 24


Hoàng Thị Xoan, Nguyễn Thị Nga

else if(w0 < 0)
{
cout << "\t\ty = " << w1 << "x - " << (-1)*w0 << endl;
}
else
{
cout << "\t\ty = " << w1 << "x" << endl;
}
}
else
{

cout << "\nChua tim duoc ham" << endl;
}

/*Ket qua du doan va sai so*/
cout << "\n\t\t=======BANG KET QUA DU DOAN========\n" << endl;
cout << "\t\tCotx \t\tCoty \t\tKq du doan \t\tSai so" << endl;
for(int i = 0; i < n; i++)
{
Y[i] = x[i] * w1 + w0;
ss[i] = Y[i] - y[i];
cout << fixed;
cout << setprecision(5);
cout << "\t\t" << x[i] << " \t" << y[i] << " \t" << Y[i] << " \t\t" << ss[i] << endl;
}

cout << "\nSai so du doan:\t";
for(int i = 0; i < n; i++)
{
MSE += pow(ss[i],2);
}
MSE = sqrt(MSE/n);
Page 25


×