编程实现对数几率回归算法。
时间: 2023-06-12 18:05:26 浏览: 152
以下是Python实现的对数几率回归算法:
```
import numpy as np
class LogisticRegression:
def __init__(self, learning_rate=0.01, num_iterations=10000, fit_intercept=True, verbose=False):
self.learning_rate = learning_rate
self.num_iterations = num_iterations
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_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 self.verbose and i % 1000 == 0:
z = np.dot(X, self.theta)
h = self.__sigmoid(z)
print(f'loss: {self.__loss(h, y)} \t')
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
```
这个类的构造函数有三个可选参数:`learning_rate`,`num_iterations`和`fit_intercept`。`learning_rate`指定了梯度下降算法的步长,`num_iterations`指定了迭代次数(即梯度下降算法的步数),`fit_intercept`指定是否要在输入数据中添加一个截距项。
这个类有五个方法:
- `__add_intercept`方法在输入数据中添加一个截距项。
- `__sigmoid`方法计算sigmoid函数。
- `__loss`方法计算损失函数的值。
- `fit`方法训练模型。
- `predict_prob`方法预测概率。
- `predict`方法预测类别。
使用该类的示例:
```
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
iris = load_iris()
X = iris.data[:, :2]
y = (iris.target != 0) * 1
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
model = LogisticRegression(learning_rate=0.1, num_iterations=3000)
model.fit(X_train, y_train)
preds = model.predict(X_test)
print((preds == y_test).mean())
```
该示例使用Iris数据集训练了一个对数几率回归模型,并使用测试集评估了模型的性能。
阅读全文