神经网络能够反映人类大脑的行为,允许计算机程序识别模式,以及解决人工智能、机器学习和深度学习领域的常见问题。
在生物神经网络中,每个神经元与其他神经元通过突触进行连接。
神经元之间的信息传递,属于化学物质的传递。
M-P神经元模型实际上是对单个神经元的一种建模。
以经典乳腺癌为例
In [18]
#导入需要的包
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import sklearn.datasets
from sklearn.metrics import accuracy_score #以准确率为评价指标
from sklearn.model_selection import train_test_split #用来分割数据集
#导入数据集
from sklearn.datasets import load_breast_cancer
#分离特征和标签
# 1表示良性,0表示恶性
breast_cancer = sklearn.datasets.load_breast_cancer()
data = pd.DataFrame(breast_cancer.data,columns=breast_cancer.feature_names)
data['class'] = breast_cancer.target
data['class'].value_counts()
X = data.drop('class',axis=1)
y = data['class']
#数据集划分
#划分数据集和测试集,测试集的大小为总体数据的15%。设置stratify=y
#按照数据集中y的比例分配给train和test,使得train和test中各类别数据的比例与原数据集的比例一致。通常在数据集的分类分布不平衡的情况下会用到stratify。
X_train, X_test, y_train, y_test = train_test_split(X,y, test_size=0.15, stratify=y, random_state=0)
#M—P神经元模型仅能把0或1作为输入,所以我们要把数据进行处理,划分为0和1两类。
X_binarise_train =X_train.apply(pd.cut, bins=2, labels=[1,0])
X_binarise_test = X_test.apply(pd.cut, bins=2, labels=[1,0])
#获取value,用数组进行计算
X_binarise_train = X_binarise_train.values
X_binarise_test = X_binarise_test.values
#构建M-P神经元类
class MPNeuron:
def __init__(self):
self.b = None
def model(self,x):
return (sum(x) >= self.b)
def predict(self,X):
y = []
for x in X:
y.append(self.model(x))
return np.array(y)
def fit(self,X,y):
accuracy = {}
for b in range(X.shape[1] + 1):
self.b = b
y_pred = self.predict(X)
accuracy[b] = accuracy_score(y_pred,y)
best_b = max(accuracy, key = accuracy.get)
self.b = best_b
#打印最佳b值和最高准确率
print('best_b:', best_b)
print('best_accuracy:', accuracy[best_b])
#用M-P神经元训练,机器学习叫作fit,深度学习叫作train
mp_neuron = MPNeuron()
mp_neuron.fit(X_binarise_train,y_train)
#打印accuracy_score
w = mp_neuron.predict(X_binarise_test)
accuracy_score(w,y_test)
阶跃函数 — 可以将神经元输入值与阈值的差值映射为输出值1或0.若差值大于等于零则输出1,对应兴奋;若差值小于零则输出0,对应抑制。
S型函数(sigmoid函数)— 无论输入值的范围有多大,这个函数都可以将输出挤压在范围(0,1)之内。
阶跃函数
In [2]
import numpy as np
import matplotlib.pyplot as plt
def step_function(x):
return np.where(x >= 0, 1, 0) # 如果输入值大于等于0,则输出1,否则输出0
x = np.linspace(-2, 2, 1000) # 创建一个从-2到2的等差数列,包含1000个元素
y = step_function(x)
plt.figure(figsize=(8, 6)) # 创建一个8x6大小的新图形
plt.plot(x, y)
plt.title('Step Function')
plt.xlabel('x')
plt.ylabel('y')
plt.grid(True) # 添加网格线
plt.axis('on') #显示坐标轴
plt.show()
<Figure size 800x600 with 1 Axes>
S型函数
In [16]
# 导入numpy库,用于进行数学计算
import numpy as np
# 导入matplotlib库,用于绘制图形
import matplotlib.pyplot as plt
# 定义sigmoid函数,接受一个参数x
def sigmoid(x):
# 返回1 / (1 + np.exp(-x))的结果,np.exp(-x)计算e的-x次方
return 1 / (1 + np.exp(-x))
# 使用numpy的linspace函数在-10和10之间创建一个等间距的点集,结果存储在x中
x = np.linspace(-10, 10, 1000)
# 计算每个点的sigmoid值并存储在y中
y = sigmoid(x)
# 使用matplotlib的plot函数将这个函数绘制出来
plt.plot(x, y)
# 设置图形的标题为"Sigmoid Function"
plt.title("Sigmoid Function")
# 设置x轴的标签为"x"
plt.xlabel("x")
# 设置y轴的标签为"y"
plt.ylabel("y")
# 添加网格线
plt.grid(True)
# 显示图像
plt.show()
<Figure size 640x480 with 1 Axes>