不使用类编写对数几率模型python
时间: 2023-08-02 12:08:22 浏览: 105
以下是一个不使用类编写的对数几率回归 Python 代码示例:
```python
import numpy as np
import matplotlib.pyplot as plt
# 生成数据
np.random.seed(0)
X = np.random.randn(100, 2)
y = np.random.randint(0, 2, 100)
# 添加截距项
X = np.concatenate((np.ones((X.shape[0], 1)), X), axis=1)
# 初始化权重
theta = np.zeros(X.shape[1])
# 定义 sigmoid 函数
def sigmoid(z):
return 1 / (1 + np.exp(-z))
# 定义损失函数
def loss(h, y):
return (-y * np.log(h) - (1 - y) * np.log(1 - h)).mean()
# 定义梯度下降函数
def gradient_descent(X, y, theta, lr, num_iter):
for i in range(num_iter):
z = np.dot(X, theta)
h = sigmoid(z)
gradient = np.dot(X.T, (h - y)) / y.size
theta -= lr * gradient
return theta
# 训练模型
theta = gradient_descent(X, y, theta, lr=0.1, num_iter=300000)
# 预测
y_pred = (sigmoid(np.dot(X, theta)) >= 0.5).astype(int)
# 画出决策边界
plt.scatter(X[:, 1], X[:, 2], c=y_pred)
x1_min, x1_max = X[:, 1].min(), X[:, 1].max(),
x2_min, x2_max = X[:, 2].min(), X[:, 2].max(),
xx1, xx2 = np.meshgrid(np.linspace(x1_min, x1_max), np.linspace(x2_min, x2_max))
grid = np.c_[xx1.ravel(), xx2.ravel(), np.ones(xx1.ravel().shape)]
probs = sigmoid(np.dot(grid, theta)).reshape(xx1.shape)
plt.contour(xx1, xx2, probs, [0.5], linewidths=1, colors='red')
plt.show()
```
上述代码首先生成了随机数据 `X` 和标签 `y`,然后在 `X` 中添加截距项。然后,我们使用梯度下降算法来训练模型。在 `gradient_descent` 函数中,我们计算了预测值 `h`,损失函数梯度 `gradient`,并使用学习率 `lr` 更新权重 `theta`。最后,我们使用训练好的模型来画出决策边界。
阅读全文