bp 神经网络 分类 python
时间: 2023-10-05 20:11:51 浏览: 35
首先,你需要准备好数据集,然后导入必要的库:
```python
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
```
接着,加载数据集并对其进行预处理:
```python
df = pd.read_csv('data.csv')
X = df.iloc[:, :-1].values
y = df.iloc[:, -1].values
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=1)
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)
```
然后,定义神经网络模型:
```python
class NeuralNetwork:
def __init__(self, layers, alpha=0.1):
self.W = []
self.layers = layers
self.alpha = alpha
for i in range(0, len(layers) - 2):
w = np.random.randn(layers[i] + 1, layers[i + 1] + 1)
self.W.append(w / np.sqrt(layers[i]))
w = np.random.randn(layers[-2] + 1, layers[-1])
self.W.append(w / np.sqrt(layers[-2]))
def __sigmoid(self, x):
return 1.0 / (1 + np.exp(-x))
def __sigmoid_derivative(self, x):
return x * (1 - x)
def fit(self, X, y, epochs=1000, displayUpdate=100):
X = np.c_[X, np.ones((X.shape[0]))]
for epoch in range(0, epochs):
for (x, target) in zip(X, y):
self.fit_partial(x, target)
if epoch == 0 or (epoch + 1) % displayUpdate == 0:
loss = self.calculate_loss(X, y)
print("[INFO] epoch={}, loss={:.7f}".format(epoch + 1, loss))
def fit_partial(self, x, y):
A = [np.atleast_2d(x)]
for layer in range(0, len(self.W)):
net = A[layer].dot(self.W[layer])
out = self.__sigmoid(net)
A.append(out)
error = A[-1] - y
D = [error * self.__sigmoid_derivative(A[-1])]
for layer in range(len(A) - 2, 0, -1):
delta = D[-1].dot(self.W[layer].T)
delta = delta * self.__sigmoid_derivative(A[layer])
D.append(delta)
D = D[::-1]
for layer in range(0, len(self.W)):
self.W[layer] += -self.alpha * A[layer].T.dot(D[layer])
def predict(self, X, addBias=True):
p = np.atleast_2d(X)
if addBias:
p = np.c_[p, np.ones((p.shape[0]))]
for layer in range(0, len(self.W)):
p = self.__sigmoid(np.dot(p, self.W[layer]))
return p
def calculate_loss(self, X, targets):
targets = np.atleast_2d(targets)
predictions = self.predict(X, addBias=False)
loss = 0.5 * np.sum((predictions - targets) ** 2)
return loss
```
最后,训练并测试模型:
```python
nn = NeuralNetwork([X_train.shape[1], 16, 8, 1])
nn.fit(X_train, y_train, epochs=1000)
predictions = nn.predict(X_test)
predictions[predictions <= 0.5] = 0
predictions[predictions > 0.5] = 1
accuracy = np.mean(predictions == y_test)
print("[INFO] accuracy: {:.2f}%".format(accuracy * 100))
```
这样,你就可以使用 BP 神经网络进行分类了。