python笔记4:数据归一化(0,1),归至(-1,1)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


一、pytorch里tensor数据归一化

1.tensor数组全局归一化

数学公式
将数组中的无论正负数值归一化到[0, 1]之间
在这里插入图片描述
具体操作如下:
在这里插入图片描述

  1. 定义函数,输入参数为tensor值
  2. 求出tensor中最小值
  3. 判断最小值是否为负数
  4. 若是负数,则tensor所有数值加上最小值的绝对值,此时tensor里无负数,最小值置为0
  5. 求出tensor最大值
  6. 写出数学公式实现代码
  7. 返回值即为全局归一化后的tensor

2.tensor数组指定维度归一化

import torch
def data_normal_2d(orign_data,dim="col"):
	"""
	针对于2维tensor归一化
	可指定维度进行归一化,默认为行归一化
	参数1为原始tensor,参数2为默认指定行,输入其他任意则为列
    """
    if dim == "col":
        dim = 1
        d_min = torch.min(orign_data,dim=dim)[0]
        for idx,j in enumerate(d_min):
            if j < 0:
                orign_data[idx,:] += torch.abs(d_min[idx])
                d_min = torch.min(orign_data,dim=dim)[0]
    else:
        dim = 0
        d_min = torch.min(orign_data,dim=dim)[0]
        for idx,j in enumerate(d_min):
            if j < 0:
                orign_data[idx,:] += torch.abs(d_min[idx])  
                d_min = torch.min(orign_data,dim=dim)[0]
    d_max = torch.max(orign_data,dim=dim)[0]
    dst = d_max - d_min
    if d_min.shape[0] == orign_data.shape[0]:
        d_min = d_min.unsqueeze(1)
        dst = dst.unsqueeze(1)
    else:
        d_min = d_min.unsqueeze(0)
        dst = dst.unsqueeze(0)
    norm_data = torch.sub(orign_data,d_min).true_divide(dst)
    return norm_data

x = torch.randint(low=-10,high=10,size=(3,6))
data_normal_2d(x)
tensor([[1.0000, 0.8182, 0.4545, 0.0000, 0.8182, 0.2727],
        [0.6154, 0.5385, 0.5385, 0.0769, 0.0000, 1.0000],
        [0.4444, 0.3889, 0.0000, 0.2778, 1.0000, 0.5000]])

新torch方法
torch.min() / torch.max()
相较于全局归一化,指定维度使用torch.max(),torch.min()的第二种使用方法
将被求最值的tensor放入括号里,输入一个tensor的时候,如torch.min(x,dim=0),会返回两个值:第一个是指定维度为行时,各行的最小值组成的tensor;第二个返回的是各最小值的索引tensor。
tensor.unsqueeze()
该方法是将原tensor多扩充一个维度,例如代码中d_min.unsqueeze(1),是指将d_min从原来的一维向量,扩充其第二维度。


二、pytorch里tensor数据归至(-1,1)

因实际数据处理过程中,有些数据本身具有正负属性,此时若直接归一化,会损失数据本身的一些特征。
此时代码里可直接添加一行
norm_data = (norm_data-0.5).true_divide(0.5)

    else:
        d_min = d_min.unsqueeze(0)
        dst = dst.unsqueeze(0)
    norm_data = torch.sub(orign_data,d_min).true_divide(dst)
    norm_data = (norm_data-0.5).true_divide(0.5)
    return norm_data

即可将数据归一化至(-1,1)之间


  • 17
    点赞
  • 88
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
由于题目较多,我这里只列出部分题目的代码实现,供您参考。 14.2 贝叶斯网络 14.2.1 习题1 ```python import numpy as np # 构建贝叶斯网络的结构,定义每个节点的父节点 parents = { 'D': [], 'I': [], 'G': ['I', 'D'], 'S': ['I'], 'L': ['G'] } # 定义概率表 prob_tables = { 'D': np.array([0.6, 0.4]), 'I': np.array([0.7, 0.3]), 'G': np.array([ [0.3, 0.4, 0.3, 0.05, 0.95, 0.9], [0.7, 0.6, 0.7, 0.95, 0.05, 0.1] ]), 'S': np.array([ [0.95, 0.2], [0.05, 0.8] ]), 'L': np.array([ [0.1, 0.4], [0.9, 0.6] ]) } def get_prob(node, values, evidences): """ 计算节点的概率 :param node: 节点名称 :param values: 取值 :param evidences: 证据 """ if len(parents[node]) == 0: # 如果节点没有父节点 return prob_tables[node][values] else: parent_values = [evidences[parent] for parent in parents[node]] return prob_tables[node][tuple(parent_values)][values] def inference(query, evidences): """ 推断函数 :param query: 查询节点 :param evidences: 证据 """ values = [0, 1] # 取值为0或1 q = np.zeros((2,)) for value in values: evidences[query] = value # 将查询节点的取值设置为当前值 p = 1 for node in prob_tables.keys(): p *= get_prob(node, evidences[node], evidences) q[value] = p q /= np.sum(q) # 归一化 return q query = 'G' evidences = {'D': 0, 'I': 1, 'S': 1, 'L': 1} q = inference(query, evidences) print('P(G=0|D=0,I=1,S=1,L=1)={:.4f}'.format(q[0])) print('P(G=1|D=0,I=1,S=1,L=1)={:.4f}'.format(q[1])) ``` 14.3 马尔可夫网络 14.3.1 习题1 ```python import numpy as np # 构建马尔可夫网络的结构 structure = { 'A': ['C', 'D'], 'B': ['D'], 'C': ['E'], 'D': ['E'], 'E': [] } # 定义概率表 prob_tables = { 'A': np.array([ [0.4, 0.6], [0.2, 0.8] ]), 'B': np.array([0.2, 0.8]), 'C': np.array([ [0.5, 0.5], [0.3, 0.7] ]), 'D': np.array([ [0.6, 0.4], [0.1, 0.9] ]), 'E': np.array([ [0.3, 0.7], [0.8, 0.2] ]) } def inference(query, evidences): """ 推断函数 :param query: 查询节点 :param evidences: 证据 """ values = [0, 1] # 取值为0或1 q = np.zeros((2,)) for value in values: # 构建条件概率表 cpts = {} for node in structure.keys(): parents = structure[node] if len(parents) == 0: # 如果节点没有父节点 cpts[node] = prob_tables[node][value] else: parent_values = tuple([evidences[parent] for parent in parents]) cpts[node] = prob_tables[node][parent_values][value] # 计算联合概率 p = 1 for node in structure.keys(): parents = structure[node] if len(parents) == 0: # 如果节点没有父节点 p *= cpts[node] else: parent_values = tuple([evidences[parent] for parent in parents]) p *= cpts[node] q[value] = p q /= np.sum(q) # 归一化 return q query = 'E' evidences = {'A': 1, 'B': 0} q = inference(query, evidences) print('P(E=0|A=1,B=0)={:.4f}'.format(q[0])) print('P(E=1|A=1,B=0)={:.4f}'.format(q[1])) ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值