头歌平台-人工智能导论实验(神经网络)

BP神经网络

import numpy as np

def loaddataset(filename):
    fp = open(filename)

    #存放数据
    dataset = []

    #存放标签
    labelset = []
    for i in fp.readlines():
        a = i.strip().split()

        #每个数据行的最后一个是标签数据
        dataset.append([float(j) for j in a[:len(a)-1]])
        labelset.append(int(float(a[-1])))
    return dataset, labelset


#x为输入层神经元个数,y为隐层神经元个数,z输出层神经元个数
def parameter_initialization(x, y, z):

    #隐层阈值
    value1 = np.random.randint(-5, 5, (1, y)).astype(np.float64)

    #输出层阈值
    value2 = np.random.randint(-5, 5, (1, z)).astype(np.float64)

    #输入层与隐层的连接权重
    weight1 = np.random.randint(-5, 5, (x, y)).astype(np.float64)

    #隐层与输出层的连接权重
    weight2 = np.random.randint(-5, 5, (y, z)).astype(np.float64)

    return weight1, weight2, value1, value2

#返回sigmoid函数值
def sigmoid(z):
#********** Begin **********#
    return 1 / (1 + np.exp(-z))
#********** End **********#

# '''
# weight1:输入层与隐层的连接权重
# weight2:隐层与输出层的连接权重
# value1:隐层阈值
# value2:输出层阈值
# '''
def trainning(dataset, labelset, weight1, weight2, value1, value2):
    #dataset:数据集 labelset:标签数据
    #x为步长
    x = 0.01
    for i in range(len(dataset)):
        #输入数据
        inputset = np.mat(dataset[i]).astype(np.float64)
        #数据标签
        outputset = np.mat(labelset[i]).astype(np.float64)
        #隐层输入
        input1 = np.dot(inputset, weight1).astype(np.float64)
        #隐层输出
        #********** Begin **********#
        output2 = sigmoid(input1 - value1).astype(np.float64)
        #********** End **********#
        #输出层输入
        input2 = np.dot(output2, weight2).astype(np.float64)
        #输出层输出
        output3 = sigmoid(input2 - value2).astype(np.float64)

        #更新公式由矩阵运算表示
        a = np.multiply(output3, 1 - output3)
        g = np.multiply(a, outputset - output3)
        b = np.dot(g, np.transpose(weight2))
        c = np.multiply(output2, 1 - output2)
        e = np.multiply(b, c)

        value1_change = -x * e
        value2_change = -x * g
        weight1_change = x * np.dot(np.transpose(inputset), e)
        weight2_change = x * np.dot(np.transpose(output2), g)

        #更新连接权重、阈值参数value1、value2、weight1、weight2
        #********** Begin **********#
        value1 += value1_change
        value2 += value2_change
        weight1 += weight1_change
        weight2 += weight2_change
        #********** End **********#
    return weight1, weight2, value1, value2

def testing(dataset, labelset, weight1, weight2, value1, value2):
    #记录预测正确的个数
    rightcount = 0
    for i in range(len(dataset)):
        #计算每一个样例通过该神经网路后的预测值
        inputset = np.mat(dataset[i]).astype(np.float64)
        outputset = np.mat(labelset[i]).astype(np.float64)
        output2 = sigmoid(np.dot(inputset, weight1) - value1)
        output3 = sigmoid(np.dot(output2, weight2) - value2)

        #确定其预测标签:输出大于 0.5 置 flag 为 1,否则置 flag 为 0
        #********** Begin **********#
        if output3 > 0.5:
            flag = 1
        else:
            flag = 0
        #********** End **********#
        if labelset[i] == flag:
              rightcount += 1
    #返回正确率
    return rightcount / len(dataset)

Hopfield 神经网络

import numpy as np
import random
from random import randint
from matplotlib import pyplot as plt
#根据Hebb学习规则计算神经元之间的连接权值
def calcWeight(savedsample):
    N = len(savedsample[0])
    P = len(savedsample)
    mat = [0]*N
    returnMat = []
    for i in range(N):
        m = mat[:]
        returnMat.append(m)
    for i in range(N):
        for j in range(N):
            if i==j:
                continue
            sum = 0
            for u in range(P):
                sum += savedsample[u][i] * savedsample[u][j]
            returnMat[i][j] = sum/float(N)
    return returnMat
#根据神经元的输入计算神经元的输出(静态突触)
def calcXi(inMat , weighMat):
    #假设计算第t次循环后神经元的输出时,输入的参数inMat表示第t-1次循环后神经元的输出。即用上一次循环的输出做本次循环的输入。
    #weighMat权值矩阵
    returnMat = inMat
    choose = []
    for i in range(len(inMat)//5):
        #随机改变N/5个神经元的值,该参数可调,也可同时改变所有神经元的值
        choose.append(random.randint(0,len(inMat)-1))
    for i in choose:
        sum = 0
        #网络动态演变
        #********** Begin **********#
        for j in range(len(inMat)):
            sum += weighMat[i][j] * inMat[j]
        if sum>=0:
            returnMat[i] = 1
        else: returnMat[i] = -1
        #********** End **********#
    return returnMat
    
#加噪函数,在记忆样本的基础上增加30%的噪声:
def addnoise(mytest_data,n):
    #mytest_data:网络矩阵 n:节点数 
    #********** Begin **********#
    for x in range(n):
        for y in range(n):
            if random.randint(0, 10) > 7:
                mytest_data[x * n + y] = -mytest_data[x * n + y]
    #********** End **********#
    return mytest_data
    
#标准输出函数:data 为联想记忆后的矩阵,N 为方阵行数:
def regularout(data,N):
    for j in range(N):
        ch = ""
        for i in range(N):
        #矩阵元素值为 1 则输出“ X ”,否则输出“ ”
        #********** Begin **********#
            ch += " " if data[j*N+i] == -1 else "X"
        #********** Begin **********#
        print(ch)
    

第4关:卷积神经网络

import numpy as np

def my_conv(inputmatrix,kernel):
    output_size = (len(inputmatrix)-len(kernel)+1)
    res = np.zeros([output_size,output_size],np.float32)
    for i in range(len(res)):
        for j in range(len(res)):
            res[i][j] = compute_conv(inputmatrix,kernel,i,j)
    return res

#两个矩阵的卷积算法
def compute_conv(inputmatrix,kernel,i,j):
    #inputmatrix为输入矩阵,kernel为卷积核,i,j分别是每次卷积运算的首元素地址
    res = 0
    #********** Begin **********#
    for kk in range(3):
        for k in range(3):
            res +=inputmatrix[i+kk][j+k]*kernel[kk][k]  #这句是关键代码,实现了两个矩阵的点乘操作
    #********** End **********#
    return res

  • 2
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
人工智能是研究、开发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统的一门新的技术科学。它是计算机科学的一个分支,旨在了解智能的本质,并生产出一种能以人类智能相似的方式做出反应的智能机器。人工智能的研究包括机器人、语言识别、图像识别、自然语言处理和专家系统等。 神经网络是一种在生物神经网络的启示下建立的数据处理模型,通常由大量的人工神经元相互连接进行计算神经网络根据外界的信息改变自身的结构,主要通过调整神经元之间的权值对输入的数据进行建模,从而具备解决实际问题的能力。神经网络模拟了人类大脑的工作原理,通过模拟神经元之间的连接和信息传递,实现了类似人类的智能行为。 综上所述,人工智能神经网络是紧密相关的概念。人工智能是研究和开发能够模拟人类智能的系统和技术,而神经网络则是人工智能的一种具体实现方式,模拟了人类大脑的神经网络结构和工作原理。在人工智能的研究和应用中,神经网络被广泛应用于解决复杂的模式识别、分类和决策等问题,为人工智能系统提供了强大的计算和学习能力。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [神经网络人工智能](https://blog.csdn.net/qq_41860637/article/details/88781740)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值