根据给定数据集(存放在data1.txt文件中,二分类数据),编码实现基于梯度下降的Logistic回归算法,并画出决策边界;3)梯度下降过程中损失的变化图;(4)基于训练得到的参数,输入新的样本数据,输出预测值;使用pycharm实现,要求结果有三张图
时间: 2023-05-26 09:03:26 浏览: 343
1、数据集预处理
首先,需要将数据集文件(data1.txt)读入程序,将其转换成numpy数组格式,并对数据进行预处理,包括将标签转化为1和0,将特征矩阵进行归一化处理等。
import numpy as np
import matplotlib.pyplot as plt
from sklearn.utils import shuffle
# 读取数据文件(生成numpy数组格式)
def load_data(filename):
data = np.genfromtxt(filename,delimiter=',')
X = data[:,:-1]
y = data[:,-1]
y = np.array([1 if i == 1 else 0 for i in y]) # 将标签转化为1和0
X_std = (X - X.mean(axis=0)) / X.std(axis=0) # 归一化处理
return X_std, y
X, y = load_data('data1.txt')
X_train, y_train = X[:70], y[:70] # 训练集
X_test, y_test = X[70:], y[70:] # 测试集
# 绘制数据集
plt.scatter(X_train[y_train==0][:,0], X_train[y_train==0][:,1], color='r')
plt.scatter(X_train[y_train==1][:,0], X_train[y_train==1][:,1], color='b')
plt.xlabel('Feature 1')
plt.ylabel('Feature 2')
plt.title('Training Data')
plt.show()
# 对数据集进行随机重排
X_train, y_train = shuffle(X_train, y_train)
2、模型训练
接下来,需要实现Logistic回归模型及其梯度下降算法。模型中需设置学习率、迭代次数、权重系数初始值等参数,可根据数据集的情况进行调节。为了可视化梯度下降的过程,需要记录每一次迭代后的损失函数值,并将损失函数的曲线绘制出来。
# 定义sigmoid函数
def sigmoid(z):
return 1 / (1 + np.exp(-z))
# 定义损失函数
def cost_function(X, y, w):
z = np.dot(X,w)
h = sigmoid(z)
J = -1 * np.sum((y * np.log(h)) + ((1 - y) * np.log(1 - h))) / len(X)
return J
# 定义梯度下降函数
def gradient_descent(X, y, w, lr, num_iter):
m = len(X)
loss_history = []
for i in range(num_iter):
z = np.dot(X,w)
h = sigmoid(z)
gradient = np.dot(X.T, (h-y)) / m
w -= lr * gradient
loss = cost_function(X, y, w)
loss_history.append(loss)
return w, loss_history
# 初始化权重系数
w_init = np.zeros(X.shape[1])+0.001
# 设置训练参数
lr = 0.1
num_iter = 100
# 模型训练
w, loss_history = gradient_descent(X_train, y_train, w_init, lr, num_iter)
# 绘制损失函数曲线
plt.plot(range(num_iter), loss_history)
plt.xlabel('Iteration')
plt.ylabel('Loss')
plt.title('Loss Function')
plt.show()
3、绘制决策边界
模型训练完成后,可绘制出模型的决策边界。对于Logistic回归模型,决策边界用线性方程来表示。在二维情况下,决策边界可表示为:w0 + w1*x1 + w2*x2 = 0,将其转化为直线方程:x2 = (-w0 -w1*x1) / w2。
# 绘制决策边界
x1 = np.linspace(-2, 2, 100)
x2 = (-w[0] - w[1]*x1) / w[2]
plt.scatter(X_train[y_train==0][:,0], X_train[y_train==0][:,1], color='r')
plt.scatter(X_train[y_train==1][:,0], X_train[y_train==1][:,1], color='b')
plt.plot(x1, x2, color='k', linewidth=1, linestyle='--')
plt.xlabel('Feature 1')
plt.ylabel('Feature 2')
plt.title('Decision Boundary')
plt.show()
4、模型预测
最后,可使用训练好的模型对新的样本数据进行预测。对于一个新的样本,需要根据模型所学到的权重系数来计算预测值,然后将预测值进行二分类输出。
# 对新样本进行预测
def predict(X, w):
z = np.dot(X,w)
h = sigmoid(z)
y_pred = np.array([1 if i > 0.5 else 0 for i in h])
return y_pred
# 计算在测试集上的准确率
y_pred = predict(X_test, w)
acc = np.sum(y_test == y_pred) / len(y_test)
print('Accuracy:', acc)
# 绘制测试集结果
plt.scatter(X_test[y_test==0][:,0], X_test[y_test==0][:,1], color='r')
plt.scatter(X_test[y_test==1][:,0], X_test[y_test==1][:,1], color='b')
plt.xlabel('Feature 1')
plt.ylabel('Feature 2')
plt.title('Test Data')
plt.show()
阅读全文