1.各部分代码
1.1 数据加载
数据集包含两个特征、一个类别标签,共一百个样本。
def load_dataset(filename):
# 特征数据
dataset = []
# 标签数据
labels = []
with open(filename) as file:
for eachline in file.readlines():
# 将每一行的换行符去除并以空格拆分整行
data_list = eachline.strip('\n').split('\t')
# 初始化Xo为1,X1,X2为读取数据中的第一位、第二位值
# 注意加上数值类型转化,不加容易出错
dataset.append([1.0, float(data_list[0]), float(data_list[1])])
labels.append(int(data_list[2]))
return dataset, labels
1.2 梯度上升优化算法
def sigmoid(x):
# 跃阶函数表达式
return 1.0/(1 + np.exp(-x))
import numpy as np
# 梯度上升优化算法
def grad_ascent(dataset, labels):
# 将列表转换成矩阵,方便进行矩阵运算
data_matrix_mn = np.mat(dataset)
label_matrix_m1 = np.mat(labels).transpose()
# m:样本个数 n:特征个数
m, n = np.shape(data_matrix_mn)
# 初始化权重矩阵
weight_matrix_n1 = np.ones((n, 1))
# 步长
alpha = 0.001
# 训练次数
times = 500
for i in range(times):
h_matrix_m1 = sigmoid(data_matrix_mn * weight_matrix_n1)
error_matrix_m1 = label_matrix_m1 - h_matrix_m1
# 根据计算出来error矩阵和步长调整权重矩阵 [1]
weight_matrix_n1 = weight_matrix_n1 + alpha * data_matrix_mn.transpose() * error_matrix_m1
return weight_matrix_n1
关于[1]的原理可见
点击打开链接。用一个例子定性解释了一下,没有严格证明。
1.3 数据集及决策边界可视化
def draw_divide_line(dataset, labels, weights):
import matplotlib.pyplot as plt
# 类别1和类别0的坐标
x1 = []
y1 = []
x0 = []
y0 = []
# 将数据集的数据分类并存入坐标
for i in range(len(dataset)):
if labels[i] == 1:
x1.append(dataset[i][1])
y1.append(dataset[i][2])
else:
x0.append(dataset[i][1])
y0.append