python 逻辑回归 源码
时间: 2023-10-12 19:21:11 浏览: 100
以下是一个简单的 Python 逻辑回归的实现代码:
```python
import numpy as np
class LogisticRegression:
def __init__(self, learning_rate=0.01, num_iterations=1000, fit_intercept=True):
self.learning_rate = learning_rate
self.num_iterations = num_iterations
self.fit_intercept = fit_intercept
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)
# weights initialization
self.theta = np.zeros(X.shape[1])
for i in range(self.num_iterations):
z = np.dot(X, self.theta)
h = self.__sigmoid(z)
gradient = np.dot(X.T, (h - y)) / y.size
self.theta -= self.learning_rate * gradient
if(i % 100 == 0):
z = np.dot(X, self.theta)
h = self.__sigmoid(z)
print('loss: {}'.format(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):
return self.predict_prob(X) >= threshold
```
该类包含以下方法:
1. `__init__()`: 构造函数,用于设置学习率、迭代次数和是否拟合截距项。
2. `__add_intercept()`: 内部方法,用于添加截距项。
3. `__sigmoid()`: 内部方法,用于计算 sigmoid 函数。
4. `__loss()`: 内部方法,用于计算损失函数。
5. `fit()`: 训练模型,使用梯度下降法更新权重,每 100 次迭代输出一次损失函数值。
6. `predict_prob()`: 预测样本属于正例的概率。
7. `predict()`: 预测样本的类别,需要指定阈值。
阅读全文