编程实现对数几率回归算法。
时间: 2023-06-12 10:05:38 浏览: 90
对数几率回归(Logistic Regression)是一种用于解决二分类问题的监督学习算法。它的主要思想是,将线性回归模型的输出通过一个非线性函数(sigmoid函数)映射到0和1之间,从而得到样本属于每一类的概率。本文将介绍如何使用Python实现对数几率回归算法。
首先,我们需要准备一些数据。在本例中,我们将使用Scikit-learn自带的鸢尾花数据集来进行二分类预测。
```python
from sklearn.datasets import load_iris
import pandas as pd
import numpy as np
iris = load_iris()
df = pd.DataFrame(iris.data, columns=iris.feature_names)
df['target'] = iris.target
df = df[df['target'] != 2] # 只保留两类
X = np.array(df.drop(['target'], axis=1))
y = np.array(df['target'])
```
接下来,我们需要将数据集分成训练集和测试集。我们可以使用Scikit-learn的train_test_split函数进行划分。
```python
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
```
接下来,我们需要定义sigmoid函数。sigmoid函数的公式为:
$$\sigma(z)=\frac{1}{1+e^{-z}}$$
```python
def sigmoid(z):
return 1 / (1 + np.exp(-z))
```
然后,我们需要定义成本函数。对于对数几率回归,成本函数的公式为:
$$J(\theta)=-\frac{1}{m}\sum_{i=1}^{m}[y^{(i)}\log(h_{\theta}(x^{(i)}))+(1-y^{(i)})\log(1-h_{\theta}(x^{(i)}))]$$
其中,$h_{\theta}(x)$表示sigmoid函数的输出,$\theta$表示模型的参数,$m$表示样本数量。
```python
def cost_function(theta, X, y):
h = sigmoid(np.dot(X, theta))
m = len(y)
J = -1 / m * np.sum(y * np.log(h) + (1 - y) * np.log(1 - h))
return J
```
接着,我们需要定义梯度下降函数。梯度下降的公式为:
$$\theta_j:=\theta_j-\alpha\frac{\partial J(\theta)}{\partial\theta_j}$$
其中,$\alpha$表示学习率。
对于对数几率回归,参数的更新公式为:
$$\theta_j:=\theta_j-\alpha\frac{1}{m}\sum_{i=1}^{m}(h_{\theta}(x^{(i)})-y^{(i)})x_j^{(i)}$$
```python
def gradient(theta, X, y):
h = sigmoid(np.dot(X, theta))
m = len(y)
grad = 1 / m * np.dot(X.T, h - y)
return grad
```
最后,我们可以使用梯度下降算法来训练模型,并进行预测。
```python
def logistic_regression(X, y, alpha, num_iters):
m, n = X.shape
theta = np.zeros(n)
J_history = []
for i in range(num_iters):
J = cost_function(theta, X, y)
grad = gradient(theta, X, y)
theta -= alpha * grad
J_history.append(J)
return theta, J_history
theta, J_history = logistic_regression(X_train, y_train, 0.01, 1000)
h = sigmoid(np.dot(X_test, theta))
y_pred = np.round(h)
from sklearn.metrics import accuracy_score
print('Accuracy:', accuracy_score(y_test, y_pred))
```
这样,我们就完成了对数几率回归算法的实现。
阅读全文