iris 数据转化为脉冲序列

23 篇文章 1 订阅
11 篇文章 0 订阅

引入包文件

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()

结果图:
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值