2020-11-22 逻辑回归 多分类 1.1

import math
import torch
import numpy as np

def sigmoid(x):
    '''
    ①定义sigmoid函数,只能传一位数字
    '''
    if x>700:
        x=700
    if x<-700:
        x=-700
    res=1/(1+math.exp(-x))
    return res

def mul_dui_ying(x,y):
    '''举阵对应乘法'''
    a=torch.tensor(tensor_to_list(torch.tensor(x)))
    b=torch.tensor(tensor_to_list(torch.tensor(y)))
    res=a.float().mul(b.float())
    return res


def mul_1(a,b):
    '''
    ①把两个横着的一维矩阵对应乘起来,然后相加,得数是一个数字
    ②y=a0·x0+a1·x1+…+an·xn
    '''
    a=torch.tensor([tensor_to_list(a)])
    b=torch.tensor([tensor_to_list(b)])
    res=a.float().mm(b.float().t())
    return res

def tensor_to_list(x):
    '''
    将tensor转换成list形式
    '''
    y=np.array(x)
    res=list(y)
    return res

def tensorSS_to_list(a):
    '''
    将tensor张量转换成list形式
    '''
    x=[]
    for i in np.array(a):
        x.append(list(i))
    return x

def list_zhang_liang(n,m):
    '''生成一个n x m的张量,用list表示'''
    x=[]
    for i in np.array((torch.rand(n,m))):
        x.append(list(i))
    return x



# 【文件操作】
def addwrite(filename,strr):
    with open(filename,'a+',encoding='utf-8')as f:
        f.write(str(strr))
def cleanfile(filename):
    with open(filename,'w',encoding='utf-8')as f:
        pass
    
# 【其他】
def show_in(x):
    '''展示列表内部'''
    for i in x:
        print(i)
def Logistic_Regression__in_list_out_list(i,xx,yy,aefa,xita,pinggu_qian,pinggu_xian,max_aefa,fast_break):
    '''
    输入“数据集” 和 “每一条数据集对应的标记张量”,
    输入“训练次数” 和 “每多少次输出”
    输出的内容是 “当前训练到第几次” 、“西塔张量【重要】”、“当前得分”、“两次的得分差值”
    return的是“最后的西塔张量”
    '''
    # 得到输入x,y
    x=torch.tensor(xx)
    y=torch.tensor(yy)


    xita=torch.tensor(xita)
    aefa=aefa
    pinggu_qian=pinggu_qian
    pinggu_xian=pinggu_xian

    log=[]
#     if 1:
#     try:
    sum=0 #算员
    for t in range(len(x)):#算员
        sum+=x[t]*(sigmoid(mul_1(xita,x[t]))-y[t])#算员

    xita=xita-aefa*sum

#【评估】
    pinggu_qian=pinggu_xian
    pinggu=1
    for t in range(len(x)):
        pinggu=pinggu* (sigmoid(mul_1(xita,x[t]))**y[t])*(1-sigmoid(mul_1(xita,x[t])))**(1-y[t]) 
    pinggu_xian=pinggu  

#【自动改学习率】  
    deerta=pinggu_xian-pinggu_qian
   # 【deerta为前后两次得分函数的差值 】       
    if deerta<=0:
        aefa=0.7*aefa
    if deerta>0:
        if deerta<0.000001:
            aefa= aefa*1.42
    if aefa>max_aefa:
        aefa=max_aefa
    po=tensor_to_list(xita)
# 【输出】
    q2=po
#         print(float(pinggu_xian))
    q3=float(pinggu_xian)
#         q3=(pinggu_xian)
#         q3=[str('%.07f'%i) for i in q3]
    log.append([i,q2,q3,aefa])
#                 print(times+1," | 西塔向量:",po," | 得分函数:",tensor_to_list(pinggu_xian),"| 相邻两次提高得分:",tensor_to_list(deerta)," |  \n") 
    log=log[0]
#     wrong=0
#     except:
#         wrong=1
#         pass
#         return xx,yy,aefa,tensor_to_list(xita),float(pinggu_qian),float(pinggu_xian),log
    
    # <fast_break>  
    if abs(fast_break[0]-float(pinggu_qian))<=0.0000000001:
        fast_break[1]=fast_break[1]+1
    else:
#         if i%1000==0:
#             print(fast_break[0],float(pinggu_qian))
        fast_break[0]=float(pinggu_qian)
        fast_break[1]=1
        
    return xx,yy,aefa,tensor_to_list(xita),float(pinggu_qian),float(pinggu_xian),log,fast_break

# 自动生成5类数据,数据1000条进行训练
KUAN=5
LEN=1000
# 随机生成数
X=list_zhang_liang(LEN,KUAN);
for i in range(len(X)):
    X[i][0]=1
show_in(X)
x=X
Y=list_zhang_liang(LEN,1);
Y=[int(i[0]*1000%KUAN) for i in Y]
show_in(Y)
# 设置新的变量new_y
new_y=tensorSS_to_list(torch.zeros(len(Y),KUAN).long())
new_y
# 赋值
for i in range(len(Y)):
    new_y[i][Y[i]]=1
new_y
# 取各个列的值存在yy中
yy=[]
for lie in range(KUAN):
    temp=[]
    for data in range(len(new_y)):
        temp.append(new_y[data][lie])
    yy.append(temp)
yy
logs=[]
for y in yy:
    # 得到西塔的大小,初始化西塔
    xita = (tensor_to_list(torch.rand(1,list(torch.tensor(x).shape)[1]))[0])
    aefa=1
    pinggu_qian=0
    pinggu_xian=0
    fastbreak=[0,1]
    for i in range(5000):
        x,y,aefa,xita,pinggu_qian,pinggu_xian,log,fastbreak=Logistic_Regression__in_list_out_list(i,x,y,aefa,xita,pinggu_qian,
                                                                                                   pinggu_xian,max_aefa=1,
                                                                                                   fast_break=fastbreak
                                                                                                  )
        if fastbreak[1]>=30:
            break
        if i%500==0:
            print(log)
    print(log) 
    logs.append(log)
y_yuce=[]
rate=[]
geshu=[]
for ii in range(len(logs)):
    count=0
    yuce=[]
    yuceefloat=[]
    for i in x:
#         print(i,logs[ii][1])
        yuce.append(int(sigmoid(tensor_to_list(mul_1(i,logs[ii][1])[0])[0])+0.5))
        yuceefloat.append(round(sigmoid(tensor_to_list(mul_1(i,logs[ii][1])[0])[0]),1))
    y_yuce.append(yuceefloat)
    ww=0
    rr=0
    for t in range(len(yy[ii])):
        if yy[ii][t]==1:
            count+=1
            if yy[ii][t]==yuce[t]:
                rr+=1
            else:ww+=1
    geshu.append(count)     
    print(ii,"组查全率:",rr/(rr+ww)*100,"%")
    rate.append(rr/(rr+ww))
yyyy_yuce = (torch.tensor(y_yuce).t())
yyyy_yuce
yyyy_yuce_anti=(1-(torch.tensor(y_yuce).t()))
yyyy_yuce_anti
aaa=mul_dui_ying(tensorSS_to_list(torch.tensor(tensorSS_to_list(yyyy_yuce))),rate)
bbb=mul_dui_ying(tensorSS_to_list(torch.tensor(tensorSS_to_list(yyyy_yuce_anti))),tensor_to_list((1-torch.tensor(rate))/(sum(geshu)-torch.tensor(geshu))))
gg=tensorSS_to_list(aaa+bbb)
gg
ee=[]
for v in gg:
    print(v.index(max(v)))
    ee.append(v.index(max(v)))
Y
ee
wwwwwwww=0
rrrrrrrr=0
for i in range(len(Y)):
    if Y[i]==ee[i]:
        rrrrrrrr+=1
    else:
        wwwwwwww+=1
print(rrrrrrrr,rrrrrrrr+wwwwwwww,rrrrrrrr/(rrrrrrrr+wwwwwwww)*100,"%")
        

 

<think>好的,我现在需要回答用户关于Linux shell中重定向符号`>/dev/null 2>&1`的问题。首先,我要确认自己对这个符号的理解是否正确。 用户的问题是想了解这个命令的含义,特别是将输出重定向到/dev/null并合并错误流。我记得在Linux中,文件描述符1是标准输出(stdout),2是标准错误(stderr)。而`>/dev/null`是将标准输出重定向到空设备,也就是丢弃输出。然后`2>&1`的意思是将标准错误重定向到标准输出的位置,也就是同样丢弃错误信息。所以整个命令的作用是让命令的执行既不显示输出也不显示错误信息。 不过我需要确认一下顺序是否正确,因为有时候顺序会影响结果。比如,如果写成`2>&1 >/dev/null`,这样可能错误输出还是会被显示,因为先重定向了stderr到stdout的当前位置(即终端),然后再把stdout重定向到/dev/null。而正确的写法应该是先改变stdout的位置,再将stderr指向stdout的新位置,也就是`>/dev/null 2>&1`。这一点需要注意,用户可能会混淆顺序带来的不同效果。 另外,用户提到“merge error stream”,也就是合并错误流到输出流中。这时候如果使用`&>`或者`>&`这样的符号,例如`command &>/dev/null`,也可以达到同样的效果,可能更简洁。不过用户的具体例子是分开写的,可能需要解释这两种方式的异同。 还要考虑是否有其他相关知识点需要提及,例如不同的shell(如bash、zsh)在处理这些重定向时是否有差异,或者是否有类似的问题需要注意,比如子进程是否会影响重定向的结果。比如引用[1]中提到,在bash中某些情况下父进程可能不会等待所有子进程完成,这可能会影响重定向的日志处理。不过用户的问题可能不涉及这些复杂情况,但可能需要简要提及不同shell的差异。 接下来,我需要组织回答结构,首先解释每个部分的含义,然后整体作用,再举例说明,最后可能给出常见使用场景。同时,按照用户的要求,生成相关问题,可能需要包括重定向的其他用法、不同shell的区别、/dev/null的作用等。 在检查LaTeX格式时,用户提到数学表达式要用$...$,但这个问题可能不涉及数学公式,所以可能不需要使用。不过如果有涉及到变量或代码中的符号,可能需要确保格式正确。例如,在解释文件描述符时,可以用$1$和$2$表示,如文件描述符$1$代表标准输出,文件描述符$2$代表标准错误。 另外,用户要求用中文回答,所以要注意用词准确,避免术语错误。例如,“重定向”是正确的术语,而“合并错误流”可能需要更准确的表达,比如“将标准错误重定向到标准输出的位置”。 最后,生成相关问题的时候,要确保问题相关且有价值,比如询问其他重定向符号、错误处理的方法、不同shell的差异等。 总结一下,回答的结构大致如下: 1. 解释>/dev/null的作用 2. 解释2>&1的作用 3. 整体命令的作用 4. 顺序的重要性 5. 其他等效写法 6. 使用示例 7. 应用场景 8. 相关问题 需要确保每个部分都准确无误,并且引用相关的引用内容,如果有必要的话。但在这个问题中,用户的引用似乎更多是关于其他例子,比如tee命令和QEMU,可能和当前问题无关,所以可能不需要引用。但根据用户的系统指令,回答中引用的段落末尾需要添加引用标识,所以需要检查是否有需要引用的地方。例如,在提到不同shell的行为差异时,可以引用用户提供的引用[1]中的内容,说明bash和其他shell在处理子进程时的不同,但可能这更多是关于后台进程和重定向的完成时机,而不是当前问题的核心。如果和当前问题相关,可以提及,否则可能不需要。 因此,最终的思考是,用户的问题核心在于重定向的语法和含义,所以重点放在解释各个部分,顺序的重要性,以及常见用法。可能不需要涉及引用中的内容,除非在讨论相关问题时有涉及。</think>在Linux shell中,`>/dev/null 2>&1` 是**同时丢弃标准输出和标准错误**的重定向操作,具体含义如下: --- ### 分步解释 1. **`>/dev/null`** 将**标准输出(文件描述符$1$)**重定向到空设备`/dev/null`,即丢弃所有正常输出。 - 例如:`ls >/dev/null` 执行后屏幕不显示任何结果。 2. **`2>&1`** 将**标准错误(文件描述符$2$)**重定向到**标准输出的当前目标**(即`/dev/null`)。 - 注意顺序:需先指定标准输出的目标,再重定向标准错误。若写反(如`2>&1 >/dev/null`),错误仍会输出到终端[^1]。 --- ### 整体作用 - 命令的**正常输出和错误信息均被丢弃**,适用于只关注命令执行结果(通过`$?`获取返回值)、不关心输出的场景。 - 等效写法:`&>/dev/null`(更简洁,但某些旧版本shell不支持)。 --- ### 示例 ```bash # 执行命令并静默所有输出 grep "keyword" large_file.txt >/dev/null 2>&1 ``` - 若`grep`找到匹配内容,结果不显示;若文件不存在,错误信息也不显示。 --- ### 应用场景 1. **后台任务**:避免日志污染终端。 2. **脚本中非关键操作**:如临时文件清理。 3. **性能测试**:减少I/O开销对计时的影响。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值