Upload 3 files
Browse filesUpdate 3 Files: Linear Regression , Logistic Regression, Support Vector Machine
- Linear_Regression.py +163 -0
- Logistic_Regression.py +197 -0
- Support_Vector_Machine.py +145 -0
Linear_Regression.py
ADDED
|
@@ -0,0 +1,163 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# Hồi quy tuyến tính đơn giản
|
| 2 |
+
import numpy as np
|
| 3 |
+
|
| 4 |
+
# Dữ liệu y = 2x + 1
|
| 5 |
+
x = np.array([1,2,3,4,5])
|
| 6 |
+
y = np.array([3,5,7,9,11])
|
| 7 |
+
|
| 8 |
+
# Tính hệ số w và b theo công thức thống kê
|
| 9 |
+
w = np.sum((x - x.mean()) * (y - y.mean())) / np.sum((x - x.mean())**2)
|
| 10 |
+
b = y.mean() - w * x.mean()
|
| 11 |
+
|
| 12 |
+
# Dự đoán
|
| 13 |
+
y_pred = w * x + b
|
| 14 |
+
|
| 15 |
+
print(f"Phương trình: y= {w: .1f}x + {b: .1f}")
|
| 16 |
+
print(f"Dự đoán:", y_pred)
|
| 17 |
+
|
| 18 |
+
|
| 19 |
+
# Vẽ đồ thị Linear Regression để trực quan hóa
|
| 20 |
+
# Hồi quy tuyến tính đơn giản + vẽ biểu đồ
|
| 21 |
+
import numpy as np
|
| 22 |
+
import matplotlib.pyplot as plt
|
| 23 |
+
|
| 24 |
+
# Dữ liệu y = 2x + 1
|
| 25 |
+
x = np.array([1,2,3,4,5])
|
| 26 |
+
y = np.array([3,5,7,9,11])
|
| 27 |
+
|
| 28 |
+
# Tính hệ số hồi quy
|
| 29 |
+
w = np.sum((x - x.mean()) * (y - y.mean())) / np.sum((x - x.mean()) ** 2)
|
| 30 |
+
b = y.mean() - w * x.mean()
|
| 31 |
+
|
| 32 |
+
# Dự đoán
|
| 33 |
+
y_pred = w * x + b
|
| 34 |
+
|
| 35 |
+
# In ra kết quả
|
| 36 |
+
print(f"Phương trình hồi quy: y={w: .1f}x + {b: .1f}")
|
| 37 |
+
|
| 38 |
+
# Vẽ biểu đồ
|
| 39 |
+
plt.scatter(x,y, color='blue', label='Dữ liệu thật')
|
| 40 |
+
plt.plot(x,y_pred, color='red', label='Đường hồi quy')
|
| 41 |
+
plt.xlabel('x axis')
|
| 42 |
+
plt.ylabel('y axis')
|
| 43 |
+
plt.title('Hồi quy tuyến tính đơn giản + Trực quan hóa')
|
| 44 |
+
plt.legend()
|
| 45 |
+
plt.show()
|
| 46 |
+
|
| 47 |
+
# Luyện tập
|
| 48 |
+
# 1. Tuyến tính nhưng đổi hệ số khác
|
| 49 |
+
import numpy as np
|
| 50 |
+
# Dữ liệu y = 4x - 3
|
| 51 |
+
x = np.array([1,2,3,4,5,6,7])
|
| 52 |
+
y = np.array([1,5,9,13,17,21,25]) # y = 4x - 3
|
| 53 |
+
# Tính hệ số w và b theo công thức thống kê
|
| 54 |
+
w = np.sum((x - x.mean()) * (y - y.mean())) / np.sum((x - x.mean())**2)
|
| 55 |
+
b = y.mean() - w * x.mean()
|
| 56 |
+
# Dự đoán
|
| 57 |
+
y_predict = w * x + b
|
| 58 |
+
print(f"Phương trình y= {w: .0f}x + {b: .0f}")
|
| 59 |
+
print(f"Dự đoán:", y_predict)
|
| 60 |
+
# Vẽ đồ thị để trực quan hóa
|
| 61 |
+
import matplotlib.pyplot as plt
|
| 62 |
+
plt.scatter(x,y, color='black', label='Real Data')
|
| 63 |
+
plt.plot(x, y_predict, color='red', label='Predicted Data')
|
| 64 |
+
plt.xlabel('X - Axis')
|
| 65 |
+
plt.ylabel('Y - Axis')
|
| 66 |
+
plt.title('Linear Regression (4x - 3)')
|
| 67 |
+
plt.legend()
|
| 68 |
+
plt.show()
|
| 69 |
+
|
| 70 |
+
# 2. Tuyến tính có nhiễu(noise) thực tế hơn
|
| 71 |
+
# Công thức y = 3x + 2 + noise
|
| 72 |
+
import numpy as np
|
| 73 |
+
import matplotlib.pyplot as plt
|
| 74 |
+
# Dữ liệu 3x + 2 + noise
|
| 75 |
+
np.random.seed(0)
|
| 76 |
+
x = np.arange(1,11)
|
| 77 |
+
y = 3 * x + 2 + np.random.randn(10) * 2 # thêm nhiễu ngẫu nhiên
|
| 78 |
+
# Tính hệ số w và b theo công thức thống kê
|
| 79 |
+
w = np.sum((x - x.mean()) * (y - y.mean())) / np.sum((x - x.mean())**2)
|
| 80 |
+
b = y.mean() - w * x.mean()
|
| 81 |
+
# Dự đoán
|
| 82 |
+
y_predict = w * x + b
|
| 83 |
+
print(f"Phương trình + nhiễu: y = {w: .1f}x + {b: .1f}")
|
| 84 |
+
print(f"Dự đoán chính xác:", y_predict)
|
| 85 |
+
# Vẽ đồ thị trực quan hóa với nhiễu
|
| 86 |
+
plt.scatter(x,y, color='blue', label='Real Data + Noise')
|
| 87 |
+
plt.plot(x,y_predict, color='red', label='Predicted Data + Noise')
|
| 88 |
+
plt.xlabel('X - Axis')
|
| 89 |
+
plt.ylabel('Y - Axis')
|
| 90 |
+
plt.title('Linear Regression AND Noise')
|
| 91 |
+
plt.legend()
|
| 92 |
+
plt.show()
|
| 93 |
+
|
| 94 |
+
# 3. Tuyến tính nghịch (hệ số âm)
|
| 95 |
+
# Công thức y = -2x + 10
|
| 96 |
+
import numpy as np
|
| 97 |
+
import matplotlib.pyplot as plt
|
| 98 |
+
# Dữ liệu tuyến tính nghịch
|
| 99 |
+
x = np.array([1,2,3,4,5,6])
|
| 100 |
+
y = np.array([8,6,4,2,0,-2])
|
| 101 |
+
# Tính hệ số w và b theo công thức thống kê
|
| 102 |
+
w = np.sum((x - x.mean()) * (y - y.mean())) / np.sum((x - x.mean())**2)
|
| 103 |
+
b = y.mean() - w * x.mean()
|
| 104 |
+
# Dự đoán chính xác
|
| 105 |
+
y_pred = w * x + b
|
| 106 |
+
print(f"Phương trình tuyến tính nghịch: y = {w: .0f}x + {b: .0f}")
|
| 107 |
+
print(f"Dự đoán chính xác:", y_pred)
|
| 108 |
+
# Vẽ đồ thị trực quan hóa với tuyến tính nghịch
|
| 109 |
+
plt.scatter(x,y, color='red', label='Real Data')
|
| 110 |
+
plt.plot(x,y_pred, color='blue', label='Predicted Data')
|
| 111 |
+
plt.xlabel('X - Axis')
|
| 112 |
+
plt.ylabel('Y - Axis')
|
| 113 |
+
plt.title('Linear Regression AND Reversed')
|
| 114 |
+
plt.legend()
|
| 115 |
+
plt.show()
|
| 116 |
+
|
| 117 |
+
# 4. Không tuyến tính (để xem hồi quy tuyến tính kém thế nào)
|
| 118 |
+
# Công thức: y = x**2 + noise
|
| 119 |
+
import numpy as np
|
| 120 |
+
import matplotlib.pyplot as plt
|
| 121 |
+
# Dữ liệu không tuyến tính
|
| 122 |
+
np.random.seed(1)
|
| 123 |
+
x = np.linspace(-5,5,20) # Giải thích: .linspace(start, stop, num) với num=number là số giá trị cách đều nhau
|
| 124 |
+
y = x**2 + np.random.randn(20)*3 # Sinh ra 20 số ngẫu nhiên tuân theo phân phối chuẩn (Gaussian) → trung bình = 0, độ lệch chuẩn = 1; Nhân với 3 để phóng đại độ nhiễu (noise) → sai số ngẫu nhiên có độ lệch chuẩn ≈ 3 → càng nhân lớn, dữ liệu càng "rải" quanh đường parabol. y là giá trị theo hàm bậc hai, có thêm nhiễu ngẫu nhiên để giống dữ liệu thật. Đây là mối quan hệ phi tuyến tính giữa x và y.
|
| 125 |
+
# Tính hệ số w và b theo công thức thống kê
|
| 126 |
+
w = np.sum((x - x.mean()) * (y - y.mean())) / np.sum((x - x.mean())**2)
|
| 127 |
+
b = y.mean() - w * x.mean()
|
| 128 |
+
# Dự đoán chính xác
|
| 129 |
+
y_pred = w * x + b
|
| 130 |
+
print(f"Phương trình không tuyến tính: y={w: 1f}x + {b: .1f}")
|
| 131 |
+
print(f"Dự đoán chính xác:", y_pred)
|
| 132 |
+
# Vẽ đồ thị để trực quan hóa không tuyến tính
|
| 133 |
+
plt.scatter(x,y, color='red', label='Real Data with no linear')
|
| 134 |
+
plt.plot(x,y_pred, color='blue', label='Predicted Data with no linear')
|
| 135 |
+
plt.xlabel('X - Axis')
|
| 136 |
+
plt.ylabel('Y - Axis')
|
| 137 |
+
plt.title(' No Linear Regression')
|
| 138 |
+
plt.legend()
|
| 139 |
+
plt.show()
|
| 140 |
+
|
| 141 |
+
# 5. Dữ liệu ngẫu nhiên để luyện hiểu độ phù hợp (low R**2)
|
| 142 |
+
import numpy as np
|
| 143 |
+
import matplotlib.pyplot as plt
|
| 144 |
+
# Dữ liệu ngẫu nhiên
|
| 145 |
+
np.random.seed(2)
|
| 146 |
+
x = np.random.randint(1,100,20) # Giải thích: np.random.randint(low,high,size) với size là tổng số ptử muốn tạo ra
|
| 147 |
+
y = np.random.randint(1,100,20)
|
| 148 |
+
|
| 149 |
+
# Tính hệ số w và b theo công thức thống kê
|
| 150 |
+
w = np.sum((x - x.mean()) * (y - y.mean())) / np.sum((x - x.mean())**2)
|
| 151 |
+
b = y.mean() - w * x.mean()
|
| 152 |
+
# Dự đoán chính xác
|
| 153 |
+
y_pred = w * x + b
|
| 154 |
+
print(f"Phương trình tuyến tính + Random Data: y={w: 1f}x + {b: .1f}")
|
| 155 |
+
print(f"Dự đoán chính xác:", y_pred)
|
| 156 |
+
# Vẽ đồ thị để trực quan hóa không tuyến tính
|
| 157 |
+
plt.scatter(x,y, color='red', label='Real Data + Random')
|
| 158 |
+
plt.plot(x,y_pred, color='blue', label='Predicted Data + Random')
|
| 159 |
+
plt.xlabel('X - Axis')
|
| 160 |
+
plt.ylabel('Y - Axis')
|
| 161 |
+
plt.title('Linear Regression With Random Data')
|
| 162 |
+
plt.legend()
|
| 163 |
+
plt.show()
|
Logistic_Regression.py
ADDED
|
@@ -0,0 +1,197 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
'''
|
| 2 |
+
Logistic Regression là một mô hình học có giám sát (supervised learning) dùng cho bài toán phân loại (classification).
|
| 3 |
+
Nó dựa trên Linear Regression, nhưng thay vì dự đoán giá trị liên tục → nó biến đầu ra thành xác suất (0–1) bằng hàm sigmoid.
|
| 4 |
+
|
| 5 |
+
🧠 2. CÔNG THỨC TOÁN HỌC
|
| 6 |
+
2.1. Linear part
|
| 7 |
+
Trước hết, ta tính tổng có trọng số:
|
| 8 |
+
z = w0 + w1x1 + w2x2 + w3x3 + ... + wnxn
|
| 9 |
+
2.2 Áp dụng hàm Sigmoid
|
| 10 |
+
y^ = σ(z) = 1 / 1 + e^-z
|
| 11 |
+
=> Kết quả y^ nằm trong khoảng (0,1) hiểu là xác xuất đối tượng thuộc lớp 1.
|
| 12 |
+
|
| 13 |
+
📊 3. QUYẾT ĐỊNH PHÂN LOẠI
|
| 14 |
+
Nếu:
|
| 15 |
+
y^ >= 0.5 ==> dự đoán 1
|
| 16 |
+
y^ < 0.5 ==> dự đoán 0
|
| 17 |
+
|
| 18 |
+
⚙️ 4. HÀM MẤT MÁT (LOSS FUNCTION)
|
| 19 |
+
Ta dùng Binary Cross-Entropy Loss (Log Loss):
|
| 20 |
+
J(w) = -1/m ∑[y^(i)log(y^^(i)) + (1-y^(i))log(1-y^^(i))]
|
| 21 |
+
Mục tiêu: tối thiểu hóa J(w) → tìm bộ trọng số w tốt nhất.
|
| 22 |
+
|
| 23 |
+
5. QUÁ TRÌNH HỌC (TRAINING)
|
| 24 |
+
Dùng Gradient Descent để cập nhật trọng số:
|
| 25 |
+
w := w - α * ∂J/∂w # Trong đó: α là learning rate.
|
| 26 |
+
'''
|
| 27 |
+
|
| 28 |
+
# 💻 6. CODE MẪU PYTHON
|
| 29 |
+
# Thư viện sử dụng cho Logistic Regression
|
| 30 |
+
import numpy as np
|
| 31 |
+
import pandas as pd
|
| 32 |
+
import matplotlib.pyplot as plt
|
| 33 |
+
from sklearn.model_selection import train_test_split
|
| 34 |
+
from sklearn.linear_model import LogisticRegression
|
| 35 |
+
from sklearn.metrics import accuracy_score, confusion_matrix, classification_report
|
| 36 |
+
|
| 37 |
+
# Dữ liệu ví dụ
|
| 38 |
+
data = pd.DataFrame({
|
| 39 |
+
'hours_studied': [1,2,3,4,5,6,7,8,9,10],
|
| 40 |
+
'pass_exam': [0,0,0,0,0,1,1,1,1,1]
|
| 41 |
+
})
|
| 42 |
+
X = data[['hours_studied']]
|
| 43 |
+
y = data['pass_exam']
|
| 44 |
+
|
| 45 |
+
# Chia dữ liệu
|
| 46 |
+
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
|
| 47 |
+
|
| 48 |
+
# Huấn luyện mô hình
|
| 49 |
+
model = LogisticRegression()
|
| 50 |
+
model.fit(X_train, y_train)
|
| 51 |
+
|
| 52 |
+
# Dự đoán
|
| 53 |
+
y_pred = model.predict(X_test)
|
| 54 |
+
print("Accuracy:", accuracy_score(y_test, y_pred))
|
| 55 |
+
print("Confusion Matrix:\n", confusion_matrix(y_test, y_pred))
|
| 56 |
+
print("Classification Report:\n", classification_report(y_test, y_pred))
|
| 57 |
+
|
| 58 |
+
# 📈 Ứng dụng thực tế của Logistic Regression
|
| 59 |
+
'''
|
| 60 |
+
Lĩnh vực Ứng dụng
|
| 61 |
+
y học Dự đoán bệnh(có/không)
|
| 62 |
+
Email Phân loại spam/không spam
|
| 63 |
+
Marketing Khách hàng mua/không mua
|
| 64 |
+
Tài chính Dự đoán vỡ nợ/không vỡ nợ
|
| 65 |
+
Nhận dạng Có khuôn mặt/không có khuôn mặt
|
| 66 |
+
'''
|
| 67 |
+
|
| 68 |
+
# 🧠 Trực quan hóa hàm Sigmoid
|
| 69 |
+
z = np.linspace(-10, 10, 100)
|
| 70 |
+
sigmoid = 1 / (1 + np.exp(-z))
|
| 71 |
+
plt.plot(z, sigmoid)
|
| 72 |
+
plt.title('Sigmoid Function')
|
| 73 |
+
plt.xlabel('z')
|
| 74 |
+
plt.ylabel('σ(z)')
|
| 75 |
+
plt.grid()
|
| 76 |
+
plt.show()
|
| 77 |
+
''' → Đồ thị cong từ 0 → 1, giúp chuyển hóa giá trị tuyến tính thành xác suất. '''
|
| 78 |
+
|
| 79 |
+
'''
|
| 80 |
+
🧩 9. ƯU ĐIỂM & NHƯỢC ĐIỂM
|
| 81 |
+
✅ Ưu điểm
|
| 82 |
+
Đơn giản, dễ huấn luyện
|
| 83 |
+
Dễ hiểu, giải thích rõ ràng
|
| 84 |
+
Hiệu quả cho dữ liệu tuyến tính
|
| 85 |
+
⚠️ Nhược điểm
|
| 86 |
+
Kém hiệu quả với dữ liệu phi tuyến
|
| 87 |
+
Không xử lý tốt nhiều lớp phức tạp (multi-class → phải dùng One-vs-Rest)
|
| 88 |
+
Giả định quan hệ tuyến tính giữa biến độc lập và log-odds
|
| 89 |
+
🧪 10. MỞ RỘNG
|
| 90 |
+
Multinomial Logistic Regression → cho phân loại nhiều lớp
|
| 91 |
+
Regularization (L1, L2) → chống overfitting
|
| 92 |
+
Feature scaling → nên chuẩn hóa dữ liệu trước khi huấn luyện
|
| 93 |
+
'''
|
| 94 |
+
|
| 95 |
+
# 🚀 Ứng dụng Nhỏ- Dự Đoán xác xuất Thi Đậu
|
| 96 |
+
hours = np.array([[7]])
|
| 97 |
+
pred = model.predict_proba(hours)
|
| 98 |
+
print(f"Xác suất đậu: {pred[0][1]*100:.2f}%")
|
| 99 |
+
|
| 100 |
+
# 🧩 12. SO SÁNH VỚI LINEAR REGRESSION
|
| 101 |
+
'''
|
| 102 |
+
Đặc điểm Linear Regression Logistic Regression
|
| 103 |
+
Đầu ra Giá trị liên tục Xác suất (0–1)
|
| 104 |
+
Bài toán Dự đoán (Regression) Phân loại (Classification)
|
| 105 |
+
Hàm kích hoạt Không có Sigmoid
|
| 106 |
+
Hàm mất mát MSE Log Loss
|
| 107 |
+
'''
|
| 108 |
+
|
| 109 |
+
# LOGISTIC REGRESSION (Dùng thư viện đơn giản)
|
| 110 |
+
import numpy as np
|
| 111 |
+
import matplotlib.pyplot as plt
|
| 112 |
+
|
| 113 |
+
# Set up styling for Matplotlib
|
| 114 |
+
plt.style.use('ggplot')
|
| 115 |
+
|
| 116 |
+
# Create dataset
|
| 117 |
+
dataset = np.array([
|
| 118 |
+
[-10, 0],
|
| 119 |
+
[-5, 0],
|
| 120 |
+
[-7, 0],
|
| 121 |
+
[0, 0],
|
| 122 |
+
[-2, 0],
|
| 123 |
+
[5, 1],
|
| 124 |
+
[7, 1],
|
| 125 |
+
[6, 1],
|
| 126 |
+
[10, 1],
|
| 127 |
+
[15, 1],
|
| 128 |
+
[9, 1]
|
| 129 |
+
])
|
| 130 |
+
|
| 131 |
+
# Draw the dataset
|
| 132 |
+
negative_class = dataset[:5]
|
| 133 |
+
positive_class = dataset[5:]
|
| 134 |
+
|
| 135 |
+
# Draw the negative first and positive
|
| 136 |
+
plt.scatter(negative_class[:, 0], negative_class[:, 1], c='y', label='Class 0')
|
| 137 |
+
plt.scatter(positive_class[:, 0], positive_class[:, 1], c='g', label='Class 1')
|
| 138 |
+
plt.legend()
|
| 139 |
+
plt.show()
|
| 140 |
+
|
| 141 |
+
|
| 142 |
+
# -------------------- Logistic Regression Functions --------------------
|
| 143 |
+
def get_prediction(m, b, x):
|
| 144 |
+
"""
|
| 145 |
+
Get the predictions: y_hat using the input
|
| 146 |
+
"""
|
| 147 |
+
return 1 / (1 + np.exp(-(m * x + b))) # ✅ Sửa công thức sigmoid
|
| 148 |
+
|
| 149 |
+
|
| 150 |
+
def get_cost(y, y_hat):
|
| 151 |
+
"""
|
| 152 |
+
Get the value of the cost function
|
| 153 |
+
"""
|
| 154 |
+
k = y.shape[0]
|
| 155 |
+
return (-1 / k) * np.sum(y * np.log(y_hat) + (1 - y) * np.log(1 - y_hat))
|
| 156 |
+
|
| 157 |
+
|
| 158 |
+
def get_gradient(m, b, x, y, y_hat):
|
| 159 |
+
"""
|
| 160 |
+
Return the gradient of the loss function w.r.t m and b
|
| 161 |
+
"""
|
| 162 |
+
k = y.shape[0]
|
| 163 |
+
dm = (1 / k) * np.sum((y_hat - y) * x)
|
| 164 |
+
db = (1 / k) * np.sum(y_hat - y)
|
| 165 |
+
return dm, db
|
| 166 |
+
|
| 167 |
+
|
| 168 |
+
def get_accuracy(y, y_hat):
|
| 169 |
+
return ((y_hat >= 0.5).astype(int) == y).sum() / y.shape[0] # ✅ Sửa chia đúng mẫu
|
| 170 |
+
|
| 171 |
+
|
| 172 |
+
# -------------------- Gradient Descent --------------------
|
| 173 |
+
m = 1.0
|
| 174 |
+
b = 10.0
|
| 175 |
+
iterations = 200
|
| 176 |
+
lr = 0.03
|
| 177 |
+
x = dataset[:, 0]
|
| 178 |
+
y = dataset[:, 1]
|
| 179 |
+
costs = []
|
| 180 |
+
|
| 181 |
+
for it in range(iterations):
|
| 182 |
+
y_hat = get_prediction(m, b, x)
|
| 183 |
+
cost = get_cost(y, y_hat)
|
| 184 |
+
accuracy = get_accuracy(y, y_hat)
|
| 185 |
+
print(f"Iteration {it} - Cost: {cost:.4f}, Accuracy: {accuracy:.4f}")
|
| 186 |
+
|
| 187 |
+
dm, db = get_gradient(m, b, x, y, y_hat) # ✅ Sửa dn → db
|
| 188 |
+
m -= lr * dm
|
| 189 |
+
b -= lr * db
|
| 190 |
+
costs.append(cost)
|
| 191 |
+
|
| 192 |
+
# Plot cost over iterations
|
| 193 |
+
plt.plot(costs)
|
| 194 |
+
plt.xlabel("Iteration")
|
| 195 |
+
plt.ylabel("Cost")
|
| 196 |
+
plt.title("Cost Function over Time")
|
| 197 |
+
plt.show()
|
Support_Vector_Machine.py
ADDED
|
@@ -0,0 +1,145 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
'''
|
| 2 |
+
🧠 1. SVM là gì?
|
| 3 |
+
SVM là một thuật toán phân loại (classification) trong Machine Learning.
|
| 4 |
+
Nó tìm ra một đường ranh giới (hyperplane) để phân tách các nhóm dữ liệu khác nhau.
|
| 5 |
+
|
| 6 |
+
Ví dụ:
|
| 7 |
+
Nếu dữ liệu có 2 lớp (A và B), SVM tìm đường thẳng (2D) hoặc mặt phẳng (3D) sao cho:
|
| 8 |
+
Hai nhóm tách nhau rõ nhất.
|
| 9 |
+
Khoảng cách (margin) từ ranh giới đến điểm gần nhất của mỗi nhóm là lớn nhất.
|
| 10 |
+
'''
|
| 11 |
+
|
| 12 |
+
'''
|
| 13 |
+
🧩 2. Ý tưởng trực quan
|
| 14 |
+
Hãy tưởng tượng:
|
| 15 |
+
Bạn có hai nhóm điểm đỏ 🔴 và xanh 🔵.
|
| 16 |
+
Có nhiều cách vẽ đường thẳng chia 2 nhóm này.
|
| 17 |
+
SVM chọn đường chia có khoảng cách xa nhất với cả hai nhóm.
|
| 18 |
+
👉 Vì khoảng cách lớn → mô hình tổng quát tốt → ít lỗi khi gặp dữ liệu mới.
|
| 19 |
+
'''
|
| 20 |
+
|
| 21 |
+
'''
|
| 22 |
+
⚖️ 3. Khi dữ liệu bị lẫn (không tách được thẳng)
|
| 23 |
+
Nếu các điểm bị xen kẽ (không thể chia bằng đường thẳng),
|
| 24 |
+
SVM dùng kernel trick để:
|
| 25 |
+
“Nâng dữ liệu lên không gian cao hơn”
|
| 26 |
+
Ở đó, có thể tìm được đường chia tuyến tính dễ hơn.
|
| 27 |
+
'''
|
| 28 |
+
|
| 29 |
+
'''
|
| 30 |
+
🧮 4. Tham số quan trọng
|
| 31 |
+
| Tham số | Ý nghĩa | Cách chọn |
|
| 32 |
+
| ---------- | ------------------------------------- | ---------------------------------------------- |
|
| 33 |
+
| C | Cân bằng giữa “ít lỗi” và “biên rộng” | Bắt đầu với 1, rồi thử 0.1 → 10 |
|
| 34 |
+
| kernel | Kiểu ranh giới | `'linear'` (đường thẳng) hoặc `'rbf'` ( đường cong) |
|
| 35 |
+
| gamma | Mức “uốn cong” khi dùng RBF kernel | Giá trị nhỏ = biên mềm, lớn = biên sát dữ liệu |
|
| 36 |
+
'''
|
| 37 |
+
|
| 38 |
+
# 🧰 5. Cách dùng trong Python
|
| 39 |
+
from sklearn.svm import SVC
|
| 40 |
+
from sklearn.preprocessing import StandardScaler
|
| 41 |
+
from sklearn.pipeline import make_pipeline
|
| 42 |
+
from sklearn.model_selection import train_test_split
|
| 43 |
+
from sklearn.datasets import load_iris
|
| 44 |
+
|
| 45 |
+
# Dữ liệu mẫu
|
| 46 |
+
X, y = load_iris(return_X_y=True)
|
| 47 |
+
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)
|
| 48 |
+
|
| 49 |
+
# Tạo mô hình SVM
|
| 50 |
+
model = make_pipeline(StandardScaler(), SVC(kernel='rbf', C=1, gamma='scale')) # thử đổi kernel bằng linear, poly, sigmoid và Tinh chỉnh C và gamma: SVC(C=10, gamma=0.1)
|
| 51 |
+
|
| 52 |
+
# Huấn luyện
|
| 53 |
+
model.fit(X_train, y_train)
|
| 54 |
+
|
| 55 |
+
# Đánh giá
|
| 56 |
+
print("Độ chính xác:", model.score(X_test, y_test))
|
| 57 |
+
|
| 58 |
+
'''
|
| 59 |
+
✅ Giải thích:
|
| 60 |
+
StandardScaler() → chuẩn hóa dữ liệu (rất quan trọng)
|
| 61 |
+
SVC() → SVM classifier
|
| 62 |
+
kernel='rbf' → chọn ranh giới cong
|
| 63 |
+
C và gamma → điều chỉnh độ khớp của mô hình
|
| 64 |
+
'''
|
| 65 |
+
'''
|
| 66 |
+
📈 6. Khi nào nên dùng SVM?
|
| 67 |
+
✅ Khi:
|
| 68 |
+
Dữ liệu vừa phải (không quá lớn)
|
| 69 |
+
Rõ ràng giữa các lớp
|
| 70 |
+
Muốn mô hình mạnh, chính xác
|
| 71 |
+
|
| 72 |
+
❌ Tránh:
|
| 73 |
+
Dữ liệu cực lớn (hàng trăm ngàn mẫu)
|
| 74 |
+
Cần mô hình dễ giải thích
|
| 75 |
+
'''
|
| 76 |
+
'''
|
| 77 |
+
7. Ứng dụng thực tế
|
| 78 |
+
Email spam / không spam
|
| 79 |
+
Ảnh có mèo / không mèo
|
| 80 |
+
Dự đoán bệnh / không bệnh
|
| 81 |
+
Nhận diện khuôn mặt (Face Recognition)
|
| 82 |
+
Nhận diện vật thể (Object Classification)
|
| 83 |
+
Nhận dạng chữ viết tay (Handwritten Digit Recognition)
|
| 84 |
+
Phân loại văn bản (Text Classification)
|
| 85 |
+
Nhận dạng cảm xúc (Sentiment Analysis)
|
| 86 |
+
Phân loại tế bào ung thư (Cancer Cell Classification)
|
| 87 |
+
Dự đoán hoạt động gen hoặc protein
|
| 88 |
+
Phát hiện gian lận thẻ tín dụng (Fraud Detection)
|
| 89 |
+
Dự đoán rủi ro tín dụng (Credit Risk Scoring)
|
| 90 |
+
Phân loại tín hiệu thị trường chứng khoán (Up / Down)
|
| 91 |
+
Nhận dạng vật cản / đường đi cho robot tự hành
|
| 92 |
+
Dự đoán sự cố thiết bị (predictive maintenance)
|
| 93 |
+
Kiểm tra chất lượng sản phẩm (Quality Control)
|
| 94 |
+
Phân tích quy trình (Process Optimization)
|
| 95 |
+
'''
|
| 96 |
+
|
| 97 |
+
# ️ Mini Project thực tế với tập dữ liệu data.csv
|
| 98 |
+
import pandas as pd
|
| 99 |
+
import numpy as np
|
| 100 |
+
import matplotlib.pyplot as plt
|
| 101 |
+
from sklearn.svm import SVC
|
| 102 |
+
from sklearn.preprocessing import StandardScaler
|
| 103 |
+
from sklearn.model_selection import train_test_split
|
| 104 |
+
from sklearn.pipeline import make_pipeline
|
| 105 |
+
|
| 106 |
+
# 1. Đọc dữ liệu
|
| 107 |
+
data = pd.read_csv(r"C:\Users\Microsoft\Machine-Learning-Tutorial\data.csv")
|
| 108 |
+
|
| 109 |
+
# 2. Lấy đặc trưng và nhãn
|
| 110 |
+
X = data.iloc[:, :-1].values # tất cả cột trừ cột cuối
|
| 111 |
+
y = data.iloc[:, -1].values # cột cuối là label
|
| 112 |
+
|
| 113 |
+
# (Chỉ vẽ được nếu dữ liệu có đúng 2 cột feature)
|
| 114 |
+
if X.shape[1] != 2:
|
| 115 |
+
raise ValueError("⚠️ Dữ liệu phải có đúng 2 cột đặc trưng để vẽ biểu đồ 2D!")
|
| 116 |
+
|
| 117 |
+
# 3. Chia tập train/test
|
| 118 |
+
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
|
| 119 |
+
|
| 120 |
+
# 4. Tạo model SVM (dùng RBF)
|
| 121 |
+
model = make_pipeline(StandardScaler(), SVC(kernel="rbf", C=1, gamma=0.5))
|
| 122 |
+
model.fit(X_train, y_train)
|
| 123 |
+
|
| 124 |
+
# 5. Độ chính xác
|
| 125 |
+
acc = model.score(X_test, y_test)
|
| 126 |
+
print(f"✅ Độ chính xác trên tập test: {acc:.2f}")
|
| 127 |
+
|
| 128 |
+
# 6. Tạo lưới để vẽ ranh giới
|
| 129 |
+
x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1
|
| 130 |
+
y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1
|
| 131 |
+
xx, yy = np.meshgrid(np.linspace(x_min, x_max, 300),
|
| 132 |
+
np.linspace(y_min, y_max, 300))
|
| 133 |
+
|
| 134 |
+
# Dự đoán cho từng điểm trong lưới
|
| 135 |
+
Z = model.predict(np.c_[xx.ravel(), yy.ravel()])
|
| 136 |
+
Z = Z.reshape(xx.shape)
|
| 137 |
+
|
| 138 |
+
# 7. Vẽ biểu đồ
|
| 139 |
+
plt.figure(figsize=(8,6))
|
| 140 |
+
plt.contourf(xx, yy, Z, alpha=0.3, cmap=plt.cm.coolwarm)
|
| 141 |
+
plt.scatter(X[:, 0], X[:, 1], c=y, s=40, cmap=plt.cm.coolwarm, edgecolors='k')
|
| 142 |
+
plt.title(f"SVM Decision Boundary (accuracy = {acc:.2f})")
|
| 143 |
+
plt.xlabel("Feature 1")
|
| 144 |
+
plt.ylabel("Feature 2")
|
| 145 |
+
plt.show()
|