数据生成器

适用于比赛数据生成

一、 回归数据生成器

def tensorGenReg(num_examples=1000,w=[2,-1,1],bias=True,delta=0.01,deg=1):
    """
    num_examples:创建数据集所需数据量
    w: 包括截距的特征系数向量
    bias:是否需要b
    delta:扰动项取值
    deg:方程次数
    return:生成的特征张量与标签张量
    """
    if bias==True:
        num_inputs=len(w)-1
        w_true = torch.tensor(w[:-1]).reshape(-1,1).float()
        b_true=torch.tensor(w[-1]).float()
        features_true=torch.randn(num_examples,num_inputs)
        if num_inputs==1:
            labels_true=torch.pow(features,deg)*w_true+b_true
        else:
            labels_true=torch.mm(torch.pow(features_true,deg),w_true)+b_true
        features=torch.cat(( features_true,torch.ones(len(features_true),1)),1)
        labels = labels_true+torch.randn(size=labels_true.shape)*delta#增加小偏差
    else:
        num_inputs=len(w)
        w_true = torch.tensor(w).reshape(-1,1).float()
        features=torch.randn(num_examples,num_inputs)
        if num_inputs==1:
            labels_true=torch.pow(features,deg)*w_true
        else:
            labels_true=torch.mm(torch.pow(features,deg),w_true)
        labels = labels_true+torch.randn(size=labels_true.shape)*delta#增加小偏差
    return features,labels

结果展示:

y = 2x_1-x_2+1假设搞这个函数的分布图

f,l=tensorGenReg(delta=0.01)
plt.subplot(121)
plt.scatter(f[:,0],l)
plt.subplot(122)
plt.scatter(f[:,1],l)

二、 分类数据生成器

创建拥有两个特征的三分类数据集,每个类别500条数据,第一类别两特征值均满足均值为4,标准差为2的标准正态分布,第二类别两特征值均满足均值为-2,标准差为2的标准正态分布,第三类别两特征值均满足均值为-6,标准差为2的标准正态分布。

torch.manual_seed(420)

num_input=2
num_examples=500
data0=torch.normal(4,2,size=(num_examples,num_input))#均值=4,标准差=2,
data1=torch.normal(-2,2,size=(num_examples,num_input))#均值=-2,标准差=2,
data2=torch.normal(-6,2,size=(num_examples,num_input))#均值=-6,标准差=2,
label0 = torch.zeros(500)
label1 = torch.ones(500)
label2=torch.full_like(label1,2)#仿照label1创建一个数组数值为2
#合并数据集
features = torch.cat((data0,data1,data2)).float()
labels = torch.cat((label0,label1,label2)).long().reshape(-1,1)#长整型
plt.scatter(features[:,0],features[:,1],c=labels)#数据展示

上面的方式还是比较简单的,我们可以尝试加入扰动项来加大难度(将各类的均值进行压缩,增加方差),下面提供普适性方案

def tensorGencla(num_examples=500,num_inputs=2,num_class=3,deg_dispersion=[4,2],bias=False):
    """
    num_examples:创建数据集所需数据量
    num_inputs: 数据集特征总数
    num_class:数据集标签类别综述
    deg_dispersion:数据分布离散程度,第一个表示均值的参考值,第二个代表随机数的标准差参考值
    bias:建立模型逻辑回归模型是否带入截距
    return:生成的特征张量与标签张量
    """
    cluster_1 = torch.empty(num_examples,1) #每一类标签张量的形状
    mean_ = deg_dispersion[0]#均值参考值
    std_ =deg_dispersion[1]#标准差参考值
    lf = []#用于储存每一类特征张量的列表容器
    ll = []#用于储存每一类标签张量的列表容器
    k = mean_*(num_class+1)/2#每一类特征张量均值的惩罚因子
    for i in range(num_class):
        data_temp = torch.normal(i*mean_-k,std_,size=(num_examples,num_inputs))#生成每一类特征张量 
        #i*mean_-k,(例如3,0,-3对称分布,迭代效率很快),式子为mean_*(i-(num_class+1)/2),i-最大值的一半,基本就在零附近的一组数
        lf.append(data_temp)#储存在lf中
        labels_temp=torch.full_like(cluster_1,i)
        ll.append(labels_temp)
    features = torch.cat(lf).float()
    labels = torch.cat(ll).float()
    return features,labels
f,l=tensorGencla(deg_dispersion=[6,4])
plt.scatter(f[:,0],f[:,1],c=l)
plt.savefig('分类器.png', dpi=300)

三、蒙特卡罗模拟

(可自主构建,灵活度很高)

四、创建小批量切分函数

       之前提到过, 在深度学习建模过程中,梯度下降是最常用的求解目标函数的优化方法,而针对不同类型、拥有不同函数特性的目标函数,所使用的梯度下降算法也各有不同。目前为止,我们判断小批量梯度下降 (MBGD)与Adam是为“普适”的优化算法,在这里介绍下小批量函数需要利用的过程。

def data_iter(batch_size,features,labels):
    """
    batch_size:每个子集需要多少数据
    features:输入特征张量
    labels:输入标签张量
    return l:包含batch_size个列表,每个列表切分后的特征和标签所组成
    """
    num_examples=len(features)
    indics=list(range(num_examples))
    random.shuffle(indices)#打乱的索引
    l=[]
    for i in range(0,num_examples,batch_size):#0到num_examples,保证每次跨越为一个batch_size
        j =torch.tensor(indices[i:min(i+batch_size,num_examples)])
        #i在indices内部的索引出来的结果张量化,最后一批可能取的不是整数,
        #所以为了保证最后取值大于序列范围,用min
        l.append([torch.index_select(features,0,j),torch.index_select(labels,0,j)])
        #对features进行批量索引
    return l

  • 10
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值