对数几率回归python代码
时间: 2023-07-09 20:32:36 浏览: 122
以下是一个简单的对数几率回归 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)
# 对数几率回归模型
class LogisticRegression:
def __init__(self, lr=0.01, num_iter=100000, fit_intercept=True, verbose=False):
self.lr = lr
self.num_iter = num_iter
self.fit_intercept = fit_intercept
self.verbose = verbose
def __add_intercept(self, X):
intercept = np.ones((X.shape[0], 1))
return np.concatenate((intercept, X), axis=1)
def __sigmoid(self, z):
return 1 / (1 + np.exp(-z))
def __loss(self, h, y):
return (-y * np.log(h) - (1 - y) * np.log(1 - h)).mean()
def fit(self, X, y):
if self.fit_intercept:
X = self.__add_intercept(X)
# 权重初始化
self.theta = np.zeros(X.shape[1])
for i in range(self.num_iter):
z = np.dot(X, self.theta)
h = self.__sigmoid(z)
gradient = np.dot(X.T, (h - y)) / y.size
self.theta -= self.lr * gradient
if self.verbose and i % 10000 == 0:
z = np.dot(X, self.theta)
h = self.__sigmoid(z)
print(f'Loss: {self.__loss(h, y)}')
def predict_prob(self, X):
if self.fit_intercept:
X = self.__add_intercept(X)
return self.__sigmoid(np.dot(X, self.theta))
def predict(self, X, threshold=0.5):
return self.predict_prob(X) >= threshold
# 训练模型
model = LogisticRegression(lr=0.1, num_iter=300000)
model.fit(X, y)
# 预测
y_pred = model.predict(X)
# 画出决策边界
plt.scatter(X[:, 0], X[:, 1], c=y_pred)
x1_min, x1_max = X[:, 0].min(), X[:, 0].max(),
x2_min, x2_max = X[:, 1].min(), X[:, 1].max(),
xx1, xx2 = np.meshgrid(np.linspace(x1_min, x1_max), np.linspace(x2_min, x2_max))
grid = np.c_[xx1.ravel(), xx2.ravel()]
probs = model.predict_prob(grid).reshape(xx1.shape)
plt.contour(xx1, xx2, probs, [0.5], linewidths=1, colors='red')
plt.show()
```
上述代码使用了 NumPy 和 Matplotlib 库。首先,我们生成了随机数据 `X` 和标签 `y`。然后,定义了一个 `LogisticRegression` 类来实现对数几率回归模型。在类中,我们实现了 `__add_intercept` 方法来添加截距项,`__sigmoid` 方法来计算 sigmoid 函数,`__loss` 方法来计算损失函数,`fit` 方法来训练模型,`predict_prob` 方法来预测概率,`predict` 方法来预测标签。最后,我们使用训练好的模型来画出决策边界。
阅读全文