目录
一、逻辑回归
1.1、模型原理
1.2、损失函数
二、实例
2.1、定义sigmoid函数
2.2、数据集
2.3、梯度上升算法
2.4、预测函数
2.5、绘画函数
三、代码
运行结果:
四、总结
优点:
缺点:
逻辑回归是一种广义的线性回归分析模型,用于解决二分类或多分类问题。逻辑回归模型,尽管名字中包含“回归”二字,实际上是一种分类方法,特别是用于处理二分类问题。它通过将线性回归的结果通过某种函数映射到(0,1)区间内,从而进行概率的预测和分类决策。逻辑回归在许多领域都有广泛应用,如医疗领域中疾病自动诊断、金融领域中的信用评分以及市场分析等。
我这个代码是通过使用逻辑回归来实现影片的二分类问题
sigmoid函数的取值范围为[0,1],通过Sigmoid函数,逻辑回归能够将任意实数值的线性组合输出映射到(0,1)区间内,这个区间正好对应于概率值的范围。这种映射使得模型的输出可以被解释为属于某一类的概率,即输出值越接近1,表示样本属于正类的可能性越高;输出值越接近0,表示样本属于负类的可能性越高。我们可以以0.5为分界在以下为负类,以上为正类
公式:
def sigmoid(z):
return 1 / (1 + np.exp(-z))
我是手动输入数据集,也可以通过读取文本来实现数据输入
def createDataSet():
group = np.array([[20, 101], [2, 102], [100, 1], [5, 110], [110, 10],
[30, 102], [100, 20], [50, 110], [110, 50], [20, 105],
[90, 30], [70, 105], [120, 40], [80, 100], [10, 90],
[40, 5], [60, 90], [100, 60], [20, 50], [10, 100],
[105, 25], [55, 95], [115, 45], [5, 85], [15, 95],
[35, 15], [30, 65], [125, 55], [55, 80], [5, 95],
[106, 15], [58, 85], [112, 48], [58, 88], [18, 88],
[38, 18], [35, 68], [128, 60], [78, 85], [8, 98],
[107, 22], [60, 80], [114, 52], [72, 82], [82, 12],
[12, 42], [72, 40], [65, 122], [95, 72], [1, 108]])
labels = ['爱情片', '爱情片', '动作片', '爱情片', '动作片',
'爱情片', '动作片', '爱情片', '动作片', '爱情片',
'动作片', '爱情片', '动作片', '爱情片', '爱情片',
'动作片', '爱情片', '动作片', '爱情片', '爱情片',
'动作片', '爱情片', '动作片', '爱情片', '爱情片',
'动作片', '爱情片', '动作片', '爱情片', '爱情片',
'动作片', '爱情片', '动作片', '爱情片', '爱情片',
'动作片', '爱情片', '动作片', '爱情片', '爱情片',
'动作片', '爱情片', '动作片', '爱情片', '动作片',
'爱情片', '动作片', '爱情片', '动作片', '爱情片']
return group, labels # 返回数据集的特征和标签
梯度上升算法,通常用于寻找目标函数的最大值。它是一种迭代优化算法,其核心思想是在每次迭代中更新变量以使目标函数值增大,直到达到最大值点或满足一定的停止条件
梯度上升算法需要注意以下几点:
函数接收四个参数:特征矩阵X、目标向量y、学习率和迭代次数。函数首先获取特征矩阵的行数和列数,然后随机初始化权重向量。接下来,通过迭代更新权重,计算线性组合、Sigmoid函数值、预测误差、权重的梯度,并根据梯度上升法更新权重。最后返回学习得到的权重向量w。
# 梯度上升优化参数
def optimize(X, y, learning_rate, num_iterations):
m, n = X.shape # 获取特征矩阵的行数和列数
w = np.random.rand(n, 1) # 随机初始化权重向量
for i in range(num_iterations): # 迭代更新权重
z = np.dot(X, w) # 计算线性组合
A = sigmoid(z) # 计算Sigmoid函数值,即预测值
dz = A - y # 计算预测误差
dw = 1/m * np.dot(X.T, dz) # 计算权重的梯度
w = w - learning_rate * dw # 根据梯度上升法更新权重
return w # 返回学习得到的权重向量w
它接受两个参数:X
和w
。X
是一个二维数组,表示输入数据;w
是一个一维数组,表示权重。函数首先计算X
和w
的点积,然后将结果传递给sigmoid
函数。sigmoid
函数将输入值映射到0和1之间。最后,函数返回一个与A
形状相同的数组,其中大于0.5的元素被转换为1,小于等于0.5的元素被转换为0。
def predict(X, w):
z = np.dot(X, w)
A = sigmoid(z)
return (A > 0.5).astype(int)
这段代码是用来绘制决策边界的。首先,它使用散点图分别绘制了类别1和类别0的数据点。然后,计算了决策边界的斜率和截距,并使用plt.plot()
函数绘制了红色的决策边界线。最后,设置了坐标轴标签、标题和图例,并显示了图形。
# 绘制决策边界
plt.scatter(X[y.flatten() == 1, 1], X[y.flatten() == 1, 2], label='Class 1', marker='o')
plt.scatter(X[y.flatten() == 0, 1], X[y.flatten() == 0, 2], label='Class 0', marker='x')
x_values = [np.min(X[:, 1]), np.max(X[:, 1])]
y_values = - (w[0] + w[1]*x_values) / w[2] # 直线方程:w0*x0 + w1*x1 + w2*x2 = 0
plt.plot(x_values, y_values, color='r', label='Decision Line')
plt.xlabel('Feature 1')
plt.ylabel('Feature 2')
plt.title('Decision Line for Logistic Regression using Gradient Ascent')
plt.legend()
plt.show()
import numpy as np
import matplotlib.pyplot as plt
# 定义sigmoid函数
def sigmoid(z):
return 1 / (1 + np.exp(-z))
# 梯度上升优化参数
def optimize(X, y, learning_rate, num_iterations):
m, n = X.shape # 获取特征矩阵的行数和列数
w = np.random.rand(n, 1) # 随机初始化权重向量
for i in range(num_iterations): # 迭代更新权重
z = np.dot(X, w) # 计算线性组合
A = sigmoid(z) # 计算Sigmoid函数值,即预测值
dz = A - y # 计算预测误差
dw = 1/m * np.dot(X.T, dz) # 计算权重的梯度
w = w - learning_rate * dw # 根据梯度上升法更新权重
return w # 返回学习得到的权重向量w
# 预测函数
def predict(X, w):
z = np.dot(X, w)
A = sigmoid(z)
return (A > 0.5).astype(int)
# 自定义数据集
def createDataSet():
group = np.array([[20, 101], [2, 102], [100, 1], [5, 110], [110, 10],
[30, 102], [100, 20], [50, 110], [110, 50], [20, 105],
[90, 30], [70, 105], [120, 40], [80, 100], [10, 90],
[40, 5], [60, 90], [100, 60], [20, 50], [10, 100],
[105, 25], [55, 95], [115, 45], [5, 85], [15, 95],
[35, 15], [30, 65], [125, 55], [55, 80], [5, 95],
[106, 15], [58, 85], [112, 48], [58, 88], [18, 88],
[38, 18], [35, 68], [128, 60], [78, 85], [8, 98],
[107, 22], [60, 80], [114, 52], [72, 82], [82, 12],
[12, 42], [72, 40], [65, 122], [95, 72], [1, 108]])
labels = ['爱情片', '爱情片', '动作片', '爱情片', '动作片',
'爱情片', '动作片', '爱情片', '动作片', '爱情片',
'动作片', '爱情片', '动作片', '爱情片', '爱情片',
'动作片', '爱情片', '动作片', '爱情片', '爱情片',
'动作片', '爱情片', '动作片', '爱情片', '爱情片',
'动作片', '爱情片', '动作片', '爱情片', '爱情片',
'动作片', '爱情片', '动作片', '爱情片', '爱情片',
'动作片', '爱情片', '动作片', '爱情片', '爱情片',
'动作片', '爱情片', '动作片', '爱情片', '动作片',
'爱情片', '动作片', '爱情片', '动作片', '爱情片']
return group, labels # 返回数据集的特征和标签
# 获取自定义数据集
X, labels = createDataSet()
y = np.array([1 if label == '爱情片' else 0 for label in labels]).reshape(-1, 1)
# 数据预处理
X = (X - np.mean(X, axis=0)) / np.std(X, axis=0)
# 添加偏置项
X = np.insert(X, 0, 1, axis=1)
# 训练模型
w = optimize(X, y, learning_rate=0.01, num_iterations=1000)
# 进行预测
predictions_subset = predict(X[:5, :], w)
# 显示前五个样本的特征向量,并在每个特征向量后加上其预测结果和实际结果
for i in range(5):
print("Feature vector:", X[i, 1:], "Predicted result:", predictions_subset[i], "Actual result:", y[i])
# 绘制决策边界
plt.scatter(X[y.flatten() == 1, 1], X[y.flatten() == 1, 2], label='Class 1', marker='o')
plt.scatter(X[y.flatten() == 0, 1], X[y.flatten() == 0, 2], label='Class 0', marker='x')
x_values = [np.min(X[:, 1]), np.max(X[:, 1])]
y_values = - (w[0] + w[1]*x_values) / w[2] # 直线方程:w0*x0 + w1*x1 + w2*x2 = 0
plt.plot(x_values, y_values, color='r', label='Decision Line')
plt.xlabel('Feature 1')
plt.ylabel('Feature 2')
plt.title('Decision Line for Logistic Regression using Gradient Ascent')
plt.legend()
plt.show()
这是经过数据预处理过后显示出的电影分类图,中间那条线表示了与测试在线的下方则表示与0是同一类,在上方则与1是同一类
这是预测集的结果