引入包文件
import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets
# step1: 加载数据集
iris = datasets.load_iris()
X = iris.data
y = iris.target
X.shape,y.shape
# step2: 数据集的划分,测试数据集和训练数据集
# 数据集划分
np.random.seed(666)
shuffle_indexs = np.random.permutation(len(X))
test_ratio = 0.5
test_size = int(len(X) * test_ratio)
test_indexs = shuffle_indexs[:test_size]
train_indexs = shuffle_indexs[test_size:]
test_indexs.shape,train_indexs.shape
x_train = X[train_indexs]
y_train = y[train_indexs]
x_test = X[test_indexs]
y_test = y[test_indexs]
x_train.shape,x_test.shape
# 数据归一化处理
from sklearn import preprocessing
# # z- score 标准化 1
# scaler = preprocessing.StandardScaler().fit(x_train)
# x_train = scaler.transform(x_train)
# x_train,np.max(x_test),np.min(x_test)
# x_test = scaler.transform(x_test)
## max - min 标准化
x_train = preprocessing.minmax_scale(x_train)
x_max = np.max(x_train)
x_min = np.min(x_train)
print(x_max,x_min)
# Gaussian 曲线群体编码
# 一个特征被6个神经元进行编码,形成一组脉冲
def feature_change_spike(x_feature,b = 1.5,m = 6):
sigma = (1/b)*((x_max-x_min)/(m-2))
mu = x_min + ((2*np.arange(1,m+1)-3)/2) * ((x_max -x_min)/(m-2)) # (6,)
thets = np.exp( -(x_feature-mu)**2/ (2*(sigma**2)) )
return list(thets)
# 输入训练数据,窗口时间pre_T,编码神经元个数m,返回脉冲时间
def data_change_spike(x_train,pre_T = 300,m = 6):
feature = x_train.shape[1] # 4
spike_time = np.zeros((x_train.shape[0],feature*m))
spike_strength = np.zeros((1,feature*m))
for i in range(x_train.shape[0]):
spike = []
for j in range(x_train.shape[1]):
# 传入的是一个特征属性
spike.append(feature_change_spike(x_train[i,j]))
spike_strength = np.array(spike).reshape(1,-1)
spike_time[i,:] = (np.round(pre_T*(1-np.array(spike_strength)))+1).reshape(1,feature*m)
return spike_time.astype(int)
## 第一种方法画出脉冲时间图
spike_time = data_change_spike(x_train)
%time plt.plot(spike_time.T,'.b',alpha=0.5)
plt.grid()
plt.show()
结果图:
方法2:
#输入训练数据,编码神经元个数m,返回脉冲时间
def spiking_genersate(x_train,mu,sigma,T_pre = 300,m = 6):
feature = x_train.shape[1] # 4
spike_time = np.zeros((int(x_train.shape[0]), feature * m)) # 120 * 24
for num in range(x_train.shape[0]):
fire_value = np.zeros(m)
fire_strength = np.zeros((feature,m))
for t in range(feature):
for i in range(m):
fire_value[i] = np.exp(-np.power((x_train[num,t]-mu[i]),2)/(2 * np.power(sigma,2)))
fire_strength[t,:] = fire_value
spike_time[num,:] = (np.round(T_pre*(1-fire_strength))+1).reshape((1,feature*m))
return spike_time
# 画出脉冲的时间图
b = 1.5
mu = x_min + (2*np.arange(1,m+1)-3)/2 * ((x_max -x_min)/(m-2))
sigma = (1/b) * ((x_max-x_min)/(m-2))
spike_time2 = spiking_genersate(x_train,mu,sigma)
plt.plot(spike_time2.T,'.r')
plt.grid()
plt.show()
结果图: