题目四:使用 numpy 编写逻辑回归算法,对 iris 数据进行二分类。 具体内容: (1)任选两个特征和两个类别进行二分类。 (2)输出:决策函数的参数、预测值、分类准确率等。 (3)可视化:选取两个特征进行散点图可视化,并可视化决策边界。
时间: 2024-02-19 20:03:50 浏览: 67
基于逻辑回归模型对 iris 数据进行二分类和多分类-sklearn实现.zip
5星 · 资源好评率100%
好的,针对您的问题,我将为您提供一个使用numpy编写逻辑回归算法的示例程序,并对iris数据集进行二分类预测。
(1)选择两个特征和两个类别进行二分类
在本次任务中,我们选择花瓣长度和花瓣宽度这两个特征,并将Setosa和Versicolor这两种鸢尾花作为正负类别。
(2)输出决策函数的参数、预测值、分类准确率等
在本次任务中,我们使用逻辑回归算法进行分类预测。在模型训练中,我们将使用梯度下降法来求解模型参数,并使用测试集进行模型预测,并计算模型的准确率。下面是代码实现:
```python
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
# 加载数据集
data = pd.read_csv('iris.csv')
data = data[data['species'].isin(['setosa', 'versicolor'])]
data['species'] = data['species'].map({'setosa': 0, 'versicolor': 1})
X = data[['petal_length', 'petal_width']].values
y = data['species'].values
# 数据预处理
X = (X - np.mean(X, axis=0)) / np.std(X, axis=0)
train_X, train_y = X[:80], y[:80]
test_X, test_y = X[80:], y[80:]
# 定义模型函数
def sigmoid(z):
return 1 / (1 + np.exp(-z))
def predict(X, w, b):
z = np.dot(X, w) + b
y_pred = sigmoid(z)
return y_pred
def loss(y, y_pred):
return -np.mean(y * np.log(y_pred) + (1 - y) * np.log(1 - y_pred))
def gradient(X, y, y_pred):
dw = np.dot(X.T, (y_pred - y)) / len(y)
db = np.mean(y_pred - y)
return dw, db
# 初始化模型参数
w = np.random.rand(2)
b = np.random.rand()
# 模型训练
epochs = 1000
learning_rate = 0.1
for epoch in range(epochs):
y_pred = predict(train_X, w, b)
l = loss(train_y, y_pred)
dw, db = gradient(train_X, train_y, y_pred)
w -= learning_rate * dw
b -= learning_rate * db
if epoch % 100 == 0:
print('epoch: {}, loss: {:.4f}'.format(epoch, l))
# 模型预测
y_pred = predict(test_X, w, b)
y_pred[y_pred >= 0.5] = 1
y_pred[y_pred < 0.5] = 0
accuracy = np.mean(y_pred == test_y)
print('accuracy: {:.2f}%'.format(accuracy * 100))
# 输出决策函数的参数
print('w: {}, b: {}'.format(w, b))
# 可视化预测结果和决策边界
x_min, x_max = test_X[:, 0].min() - 0.5, test_X[:, 0].max() + 0.5
y_min, y_max = test_X[:, 1].min() - 0.5, test_X[:, 1].max() + 0.5
xx, yy = np.meshgrid(np.arange(x_min, x_max, 0.02),
np.arange(y_min, y_max, 0.02))
Z = predict(np.c_[xx.ravel(), yy.ravel()], w, b)
Z = Z.reshape(xx.shape)
plt.contourf(xx, yy, Z, cmap=plt.cm.Spectral)
plt.scatter(test_X[:, 0], test_X[:, 1], c=test_y, cmap=plt.cm.Spectral)
plt.xlabel('petal length')
plt.ylabel('petal width')
plt.show()
```
(3)可视化数据集和决策边界
我们可以使用matplotlib库对数据集进行散点图可视化,并可视化逻辑回归的决策边界。下面是代码实现:
```python
# 可视化数据集和决策边界
x_min, x_max = X[:, 0].min() - 0.5, X[:, 0].max() + 0.5
y_min, y_max = X[:, 1].min() - 0.5, X[:, 1].max() + 0.5
xx, yy = np.meshgrid(np.arange(x_min, x_max, 0.02),
np.arange(y_min, y_max, 0.02))
Z = predict(np.c_[xx.ravel(), yy.ravel()], w, b)
Z = Z.reshape(xx.shape)
plt.contourf(xx, yy, Z, cmap=plt.cm.Spectral)
plt.scatter(X[:, 0], X[:, 1], c=y, cmap=plt.cm.Spectral)
plt.xlabel('petal length')
plt.ylabel('petal width')
plt.show()
```
运行以上代码后,我们可以看到数据集和决策边界的可视化图像。
阅读全文