使用 numpy 编写逻辑回归算法,对 iris 数据进行二分类。 具体内容: (1)任选两个特征和两个类别进行二分类。 (2)输出:决策函数的参数、预测值、分类准确率等。 (3)可视化:选取两个特征进行散点图可视化,并可视化决策边界。
时间: 2024-02-20 16:59:01 浏览: 84
python 模式识别 感知器.zip
好的,我会尽力回答你的问题。
首先,我们需要导入 numpy 和 matplotlib 库,并加载 iris 数据集。
```python
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
iris = load_iris()
X = iris.data[:, [2, 3]] # 选择两个特征
y = (iris.target == 0).astype(np.int) # 将类别为0的作为正样本,其他类别作为负样本
```
接下来,我们需要实现逻辑回归算法。
```python
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).astype(np.int)
```
接下来,我们需要训练模型并输出决策函数的参数、预测值、分类准确率等。
```python
model = LogisticRegression(lr=0.1, num_iter=300000)
model.fit(X, y)
print('决策函数的参数:', model.theta)
y_pred = model.predict(X)
print('预测值:', y_pred)
accuracy = np.mean(y_pred == y)
print('分类准确率:', accuracy)
```
最后,我们可以可视化选取的两个特征,并绘制决策边界。
```python
x1_min, x1_max = X[:, 0].min() - 1, X[:, 0].max() + 1
x2_min, x2_max = X[:, 1].min() - 1, X[:, 1].max() + 1
xx1, xx2 = np.meshgrid(np.arange(x1_min, x1_max, 0.1), np.arange(x2_min, x2_max, 0.1))
Z = model.predict(np.c_[xx1.ravel(), xx2.ravel()])
Z = Z.reshape(xx1.shape)
plt.contourf(xx1, xx2, Z, alpha=0.4)
plt.scatter(X[:, 0], X[:, 1], c=y, alpha=0.8)
plt.xlabel('花瓣长度')
plt.ylabel('花瓣宽度')
plt.show()
```
这样,我们就完成了使用 numpy 实现逻辑回归算法,并对 iris 数据进行二分类的任务。
阅读全文