01 B88bet Win tháng 5 năm 2022 - Máy tính
1. Perceptron là gì?
Perceptron là một mạng nơ-ron nhân tạo đơn lớp, được sử dụng như một thuật toán phân loại nhị phân và cũng là một dạng phân loại tuyến tính.
Nó có thể được mô tả bằng mô hình dưới đây: Một nơ-ron nhận đầu vào từ n nơ-ron khác; các tín hiệu đầu vào này được xử lý thông qua kết nối mang trọng số (các giá trị đầu vào được nhân với trọng số tương ứng rồi cộng lại). Sau đó, giá trị tổng sẽ được so sánh với một ngưỡng (Threshold); nếu bằng hoặc vượt quá ngưỡng, nơ-ron sẽ kích hoạt và đưa ra đầu ra y = 1; nếu không, nơ-ron sẽ bị ức chế và đưa ra đầu ra y = -1.
Vậy tải game 789win mô hình perceptron có thể được miêu tả như sau:
Đối với đầu vào x = {x₁, x₂, …, xₙ}, ta có: z = w₁x₁ + w₂x₂ + … + wₙxₙ. Nếu z vượt quá ngưỡng θ, đầu ra sẽ là 1; ngược lại, đầu ra sẽ là -1. Điều này được quyết định bởi hàm ký hiệu f(z):
f(z) =
{
1, nếu z ≥ θ
-1, nếu z < θ
}
Để đơn giản hóa biểu thức, chúng ta có thể đưa θ vào phương trình tuyến tính để làm cho z gọn hơn:
z = w₁x₁ + w₂x₂ + … + wₙxₙ - θ
z = w₁x₁ + w₂x₂ + … + wₙxₙ + (-θ) · 1
Từ đó, coi -θ là w₀ và 1 là x₀, biểu thức trên có thể viết lại thành: z = w₀x₀ + w₁x₁ + … + wₙxₙ = wᵀ x
Hình học của nó chính là tích vô hướng giữa hai vector w và x.
Hàm ký hiệu f(z) trở thành:
f(z) =
{
1, nếu z ≥ 0
-1, nếu z < 0
}
2. Thuật toán học của Perceptron
Chiến lược học cơ bản của perceptron khá đơn giản, áp dụng cho tập dữ liệu phân biệt tuyến tính (N là số mẫu): T = {(x⁽¹⁾, y⁽¹⁾), (x⁽²⁾, y⁽²⁾), …, (x⁽ᴺ⁾, y⁽ᴺ⁾)}
- i) Khởi tạo vector trọng số n+1 chiều w với các giá trị ngẫu nhiên không phải 0 (không được khởi tạo toàn bộ bằng 0 vì điều này sẽ ảnh hưởng đến độ rộng chứ không thay đổi hướng);
- ii) Đối với mỗi mẫu đầu vào n+1 chiều x⁽ⁱ⁾, tính toán đầu ra dự đoán ŷ⁽ⁱ⁾ dựa trên f(z). Nếu giá trị này không khớp với giá trị thực tế y⁽ⁱ⁾, cập nhật vector trọng số w, cụ thể là chỉnh sửa từng chiều trong w theo công thức wⱼ = wⱼ + Δwⱼ, trong đó Δwⱼ = η(y⁽ⁱ⁾ - ŷ⁽ⁱ⁾)xⱼ⁽ⁱ⁾, ở đây 0 < η ≤ 1 là tốc độ học, còn được gọi là bước nhảy;
- iii) Lặp lại quy trình cho đến khi tất cả các mẫu đều được phân loại đúng hoặc đạt giới hạn số lần lặp tối đa thì dừng.
Trong bước ii), sự điều chỉnh Δwⱼ rất tinh vi. Ví dụ, nếu giá trị tính toán ŷ⁽ⁱ⁾ là -1 nhưng giá trị thực tế y⁽ⁱ⁾ là 1, thì Δwⱼ sẽ di chuyển trọng số về phía dương; ngược lại, Δwⱼ sẽ di chuyển về phía âm nếu tính toán sai ngược lại. Nếu tính toán trùng khớp với giá trị thực tế, thì Δwⱼ sẽ bằng 0.
3. Thực hiện thuật toán học Perceptron bằng Python
Dưới đây là cách thực hiện thuật toán học perceptron bằng Python. Lớp Perceptron bao gồm các phương thức sau:
__init__
: Phương thức khởi tạo, khi tạo đối tượng Perceptron có thể chỉ định tốc độ học eta và số lần lặp tối đa max_iter;fit
: Phương thức huấn luyện, trước tiên dựa vào số chiều của mẫu đầu vào x (nếu là n), khởi tạo vector trọng số _w thành một dãy số ngẫu nhiên không phải 0 có chiều n+1; sau đó, dựa vào tập mẫu đầu vào x (N vector n chiều) và tập mẫu đầu ra y (N giá trị +1 hoặc -1) để điều chỉnh vector trọng số rw88 _w, nếu tìm được _w phù hợp chia dữ liệu mẫu đúng trong số lần lặp tối đa max_iter thì thoát; ngược lại, nếu đã đạt số lần lặp tối đa mà vẫn chưa tìm được _w phù hợp thì huấn luyện thất bại và thoát;_predict
: Phương thức riêng dùng để tính tích vô hướng giữa vector trọng số _w và vector đầu vào xi, trả về giá trị kiểu float;predict
: Gọi_predict
để tính tích vô hướng giữa hai vector, sau đó kiểm tra xem giá trị này có không âm hay không, nếu không âm trả về +1; ngược lại trả về -1, giá trị trả về là kiểu int. Phương thức này có thể được sử dụng trong quá trình huấn luyện hoặc sau khi huấn luyện thành công để dự đoán đầu vào mới.
from typing import List
import random
class Perceptron:
"""
Phân loại nhị phân bằng Perceptron
"""
def __init__(self, eta: float = 1.0, max_iter: int = 1000):
"""
Khởi tạo Perceptron
:param eta: 0 < eta <= 1.0
:param max_iter: Số lần lặp tối đa
"""
self.eta = eta
self.max_iter = max_iter
random.seed(1)
def fit(self, x: List[List[float]], y: List[int]) -> None:
"""
Huấn luyện dữ liệu
Sau khi thực thi, _w (vector trọng số) sẽ được tạo ra
:param x: Đầu vào, danh sách vector
:param y: Đầu ra, danh sách nhãn lớp
:return: Không có gì
"""
if len(x) <= 0:
return
# Khởi tạo vector trọng số với số nguyên ngẫu nhiên
self._w = [random.randint(-10, 10) for _ in range(len(x[0]) + 1)]
times = 0
while times < self.max_iter:
times += 1
errors = 0
for xi, yi in zip(x, y):
y_predict = self.predict(xi)
if yi - y_predict != 0:
errors += 1
for i in range(len(xi)): # Cập nhật vector _w
self._w[i + 1] += self.eta * (yi - y_predict) * xi[i]
self._w[0] += self.eta * (yi - y_predict)
print('Lần lặp: {}, xi: {}, yi: {}, y_predict: {}, _w: {}'.format(times, xi, yi, y_predict, self._w))
if 0 == errors:
break
def _predict(self, xi: List[float]) -> float:
"""
Tính giá trị dự đoán cho mẫu duy nhất xi
:param x: Mẫu duy nhất xi
:return: Tích vô hướng của vector _w và xi
"""
return sum([self._w[i + 1] * xi[i] for i in range(len(xi))]) + self._w[0]
def predict(self, xi: List[float]) -> int:
"""
Dự đoán xi thuộc lớp +1 hoặc -1
:param xi: Mẫu duy nhất xi
:return: Lớp +1 hoặc -1
"""
return 1 if self._predict(xi) >= 0 else -1
Sử dụng mô hình Perceptron trên để phân chia dữ liệu mẫu hai chiều X={(3, 3), (4, 3), (1, 1)}, với đầu ra Y={1, 1, -1}:
#!/usr/bin/env python3
import perceptron
if '__main__' == __name__:
p = perceptron.Perceptron(eta=1.0, max_iter=100)
x = [[3, 3], [4, 3], [1, 1]]
y = [1, 1, -1]
p.fit(x, y)
Theo kết quả in ra, thuật toán đã tìm được vector trọng số [-8.0, 10.0, -6.0] sau 3 vòng lặp, 6 lần đánh giá và 3 lần điều chỉnh trọng số.
4. Huấn luyện và dự đoán trên tập dữ liệu Iris
Sử dụng mã nguồn ở phần 3 để huấn luyện và dự đoán trên tập dữ liệu Iris. Tập dữ liệu này chứa ba loại hoa Iris, vì mô hình Perceptron chỉ hỗ trợ phân loại nhị phân nên chỉ chọn hai loại dữ liệu (Iris-setosa và Iris-versicolor) để huấn luyện và dự đoán (mỗi loại có 50 mẫu, lấy 40 mẫu đầu làm dữ liệu huấn luyện và 10 mẫu cuối làm dữ liệu dự đoán).
Mã nguồn thử nghiệm và dữ liệu:
#!/usr/bin/env python3
import perceptron
import csv
if '__main__' == __name__:
# Đối tượng perceptron
p = perceptron.Perceptron(eta=1.0, max_iter=100)
# Huấn luyện
x = []
y = []
with open('iris.data') as f:
for sample in csv.reader(f):
x.append([float(i) for i in sample[:4]])
y.append(1 if sample[4] == 'Iris-setosa' else -1)
p.fit(x, y)
# Dự đoán
with open('predict.data') as f:
for sample in csv.reader(f):
xi, yi = [float(i) for i in sample[:4]], sample[4]
print('Nhãn dự đoán: {}, thực tế: {}'.format(p.predict(xi), yi))
Quan sát kết quả, thuật toán Perceptron đã tìm được vector trọng số phù hợp sau 7 vòng lặp và dự đoán chính xác 20 mẫu thử nghiệm.
Tóm lại, bài viết đã nghiên cứu và hiểu rõ nguyên lý của thuật toán Perceptron, đồng thời triển khai và ứng dụng sơ bộ bằng Python. Mã nguồn đã được lưu trữ trên GitHub, mời bạn đọc fork.
[1] Sebastian & Vahid. Python Machine Learning (Second Edition). [2] Lý Hành. (2012). Phương pháp Học Thống kê (Ấn bản thứ 2). Nhà xuất bản Đại học Thanh Hoa, Bắc Kinh.