上面代码运行出来的图片分类结果没有用函数图像分割,我需要分割
时间: 2024-03-14 14:47:50 浏览: 24
如果您想要对输出的图片进行分割,可以尝试使用 Matplotlib 库中的 `subplots` 函数,将输出的图片分割成多个子图,每个子图单独显示一个类别。
具体做法是,在 `for` 循环内部,创建一个子图,并将数据点的坐标传入 `scatter` 函数中,如下所示:
```python
fig, axs = plt.subplots(1, 3, figsize=(10, 3))
for i in range(3):
axs[i].scatter(X_test[y_pred == i, 0], X_test[y_pred == i, 1], color=colors[i], marker=markers[i])
axs[i].set_title(iris.target_names[i])
plt.show()
```
这里使用了 `subplots` 函数创建了一个大小为 `(1, 3)` 的子图,表示一行三列,每个子图的大小为 `(10, 3)`。然后在 `for` 循环中,通过索引 `i` 访问子图,并将数据点的坐标传入 `scatter` 函数中。最后使用 `set_title` 函数为每个子图添加标题。
完整代码如下:
```python
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
iris = load_iris()
X = pd.DataFrame(data=iris.data, columns=iris.feature_names)
y = pd.DataFrame(data=iris.target, columns=['target'])
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)
class SoftmaxRegression:
def __init__(self, n_classes, n_features):
self.n_classes = n_classes
self.n_features = n_features
self.weights = np.zeros((n_features, n_classes))
def softmax(self, z):
return np.exp(z) / np.sum(np.exp(z), axis=1, keepdims=True)
def predict(self, X):
logits = np.dot(X, self.weights)
return np.argmax(self.softmax(logits), axis=1)
def fit(self, X, y, learning_rate=0.1, epochs=1000):
for i in range(epochs):
logits = np.dot(X, self.weights)
y_pred = self.softmax(logits)
loss = -np.mean(np.sum(y * np.log(y_pred), axis=1))
gradient = np.dot(X.T, (y_pred - y))
self.weights -= learning_rate * gradient
if i % 100 == 0:
print(f'Epoch {i}, Loss: {loss:.4f}')
model = SoftmaxRegression(n_classes=3, n_features=4)
model.fit(X_train, pd.get_dummies(y_train['target']).values, learning_rate=0.1, epochs=1000)
y_pred = model.predict(X_test)
colors = ['red', 'green', 'blue']
markers = ['o', 's', 'x']
fig, axs = plt.subplots(1, 3, figsize=(10, 3))
for i in range(3):
axs[i].scatter(X_test[y_pred == i, 0], X_test[y_pred == i, 1], color=colors[i], marker=markers[i])
axs[i].set_title(iris.target_names[i])
plt.show()
```
这样就可以将输出的图片分割成三个子图,分别显示三个类别。