可以多分类的神经网络

简介:

 

复制代码
'''
11行神经网络① 
层数可变,多类
'''
import numpy as np
import matplotlib.pyplot as plt



class BPNN(object):
    def __init__(self, neurals, epsilon=0.01, lamda=0.01):
        if not isinstance(neurals, list): raise '出错:参数 neurals 必须是 list 类型'
        self.neurals = neurals   # 各层神经元数目,如:[3,10,8,2]
        self.size = len(neurals)
        
        self.epsilon = epsilon  # 学习速率
        self.lamda = lamda      # 正则化强度

        self.w = [np.random.randn(i,j) for i,j in zip(neurals[:-1], neurals[1:])] + [None]
        self.b = [None] + [np.random.randn(1,j) for j in neurals[1:]]
        self.l = [None] * self.size
        self.l_delta = [None] * self.size
        
        self.probs = None
        
    # 前向传播
    def forward(self, X):
        self.l[0] = X
        for i in range(1, self.size-1):
            self.l[i] = np.tanh(np.dot(self.l[i-1], self.w[i-1]) + self.b[i]) # tanh 函数    
        self.l[-1] = np.exp(np.dot(self.l[-2], self.w[-2]) + self.b[-1])
        self.probs = self.l[-1] / np.sum(self.l[-1], axis=1, keepdims=True)
        
    # 后向传播
    def backward(self, y):
        self.l_delta[-1] = np.copy(self.probs)
        self.l_delta[-1][range(self.n_samples), y] -= 1
        for i in range(self.size-2, 0, -1):
            self.l_delta[i] = np.dot(self.l_delta[i+1], self.w[i].T) * (1 - np.power(self.l[i], 2)) # tanh 函数的导数
            
    # 更新权值、偏置
    def update(self):
        self.b[-1] -= self.epsilon * np.sum(self.l_delta[-1], axis=0, keepdims=True)
        for i in range(self.size-2, -1, -1):
            self.w[i] -= self.epsilon * (np.dot(self.l[i].T, self.l_delta[i+1]) + self.lamda * self.w[i])
            if i == 0: break
            self.b[i] -= self.epsilon * np.sum(self.l_delta[i], axis=0)
    
    # 计算损失
    def calculate_loss(self, y):
        loss = np.sum(-np.log(self.probs[range(self.n_samples), y]))
        loss += self.lamda/2 * np.sum([np.sum(np.square(wi)) for wi in self.w[:-1]]) # 可选
        loss *= 1/self.n_samples  # 可选
        return loss
    
    # 拟合
    def fit(self, X, y, n_iter=1000, print_loss=True):
        self.n_samples = X.shape[0] # 样本大小(样本数目)
        
        for i in range(n_iter):
            self.forward(X)
            self.backward(y)
            self.update()
            
            if not print_loss: continue
            if i%100 == 0: print(self.calculate_loss(y))
    
    # 预测
    def predict(self, x):
        self.forward(x)
        return np.argmax(self.probs, axis=1)
    

    
def plot_decision_boundary(clf, X, y):
    # Set min and max values and give it some padding
    x_min, x_max = X[:, 0].min() - .5, X[:, 0].max() + .5
    y_min, y_max = X[:, 1].min() - .5, X[:, 1].max() + .5
    h = 0.01
    # Generate a grid of points with distance h between them
    xx, yy = np.meshgrid(np.arange(x_min, x_max, h), np.arange(y_min, y_max, h))
    # Predict the function value for the whole gid
    Z = clf.predict(np.c_[xx.ravel(), yy.ravel()])
    Z = Z.reshape(xx.shape)
    # Plot the contour and training examples
    plt.contourf(xx, yy, Z, cmap=plt.cm.Spectral)
    plt.scatter(X[:, 0], X[:, 1], c=y, cmap=plt.cm.Spectral)
    
    
def test1():
    X = np.array([[0,0,1],[0,1,1],[1,0,1],[1,1,1]])
    #y = np.array([0,1,1,0]) # 两类
    y = np.array([0,1,2,3])  # 多类
    
    # bpnn = BPNN([3, 10, 8, 1])
    bpnn = BPNN([3, 10, 8, 4])
    bpnn.fit(X, y, n_iter=1000)
    
    print('训练结果:', bpnn.predict(X))
    
    
def test2():
    from sklearn.datasets import make_moons
    from sklearn.linear_model import LogisticRegressionCV
    
    X, y = make_moons(200, noise=0.20)
    plt.scatter(X[:,0], X[:,1], s=40, c=y, cmap=plt.cm.Spectral)
    plt.show()

    clf = LogisticRegressionCV()
    clf.fit(X, y)
    plot_decision_boundary(clf, X, y)
    plt.show()

    #nn = BPNN([2,5,4,2])
    nn = BPNN([2,4,2])
    nn.fit(X, y, n_iter=1000)
    plot_decision_boundary(nn, X, y)
    plt.show()
    
    
    
if __name__ == '__main__':
    #test1()
    test2()

    
复制代码

 本文转自罗兵博客园博客,原文链接:http://www.cnblogs.com/hhh5460/p/5434531.html,如需转载请自行联系原作者

相关文章
|
8月前
|
机器学习/深度学习 算法 调度
14种智能算法优化BP神经网络(14种方法)实现数据预测分类研究(Matlab代码实现)
14种智能算法优化BP神经网络(14种方法)实现数据预测分类研究(Matlab代码实现)
598 0
|
9月前
|
机器学习/深度学习 数据采集 运维
匹配网络处理不平衡数据集的6种优化策略:有效提升分类准确率
匹配网络是一种基于度量的元学习方法,通过计算查询样本与支持集样本的相似性实现分类。其核心依赖距离度量函数(如余弦相似度),并引入注意力机制对特征维度加权,提升对关键特征的关注能力,尤其在处理复杂或噪声数据时表现出更强的泛化性。
472 6
匹配网络处理不平衡数据集的6种优化策略:有效提升分类准确率
|
7月前
|
机器学习/深度学习 数据采集 存储
概率神经网络的分类预测--基于PNN的变压器故障诊断(Matlab代码实现)
概率神经网络的分类预测--基于PNN的变压器故障诊断(Matlab代码实现)
1044 0
|
8月前
|
安全 网络性能优化 网络虚拟化
网络交换机分类与功能解析
接入交换机(ASW)连接终端设备,提供高密度端口与基础安全策略;二层交换机(LSW)基于MAC地址转发数据,构成局域网基础;汇聚交换机(DSW)聚合流量并实施VLAN路由、QoS等高级策略;核心交换机(CSW)作为网络骨干,具备高性能、高可靠性的高速转发能力;中间交换机(ISW)可指汇聚层设备或刀片服务器内交换模块。典型流量路径为:终端→ASW→DSW/ISW→CSW,分层架构提升网络扩展性与管理效率。(238字)
2015 0
|
存储 数据管理 网络虚拟化
特殊网络类型分类
本文介绍了网络技术中的关键概念,包括虚拟局域网(VLAN)、存储区域网络(SAN)、网络桥接、接入网以及按拓扑结构和交换方式分类的网络类型。VLAN通过逻辑分隔提高性能与安全性;SAN提供高性能的数据存储解决方案;网络桥接实现不同网络间的互联互通;接入网解决“最后一千米”的连接问题。此外,文章详细对比了总线型、星型、树型、环型和网状型等网络拓扑结构的特点,并分析了电路交换、报文交换和分组交换的优缺点,为网络设计与应用提供了全面参考。
492 8
|
网络协议
计算机网络的分类
【10月更文挑战第11天】 计算机网络可按覆盖范围(局域网、城域网、广域网)、传输技术(有线、无线)、拓扑结构(星型、总线型、环型、网状型)、使用者(公用、专用)、交换方式(电路交换、分组交换)和服务类型(面向连接、无连接)等多种方式进行分类,每种分类方式揭示了网络的不同特性和应用场景。
3000 156
|
计算机视觉
RT-DETR改进策略【卷积层】| CGblock 内容引导网络 利用不同层次信息,提高多类别分类能力 (含二次创新)
RT-DETR改进策略【卷积层】| CGblock 内容引导网络 利用不同层次信息,提高多类别分类能力 (含二次创新)
334 5
RT-DETR改进策略【卷积层】| CGblock 内容引导网络 利用不同层次信息,提高多类别分类能力 (含二次创新)
|
计算机视觉
YOLOv11改进策略【卷积层】| CGblock 内容引导网络 利用不同层次信息,提高多类别分类能力 (含二次创新)
YOLOv11改进策略【卷积层】| CGblock 内容引导网络 利用不同层次信息,提高多类别分类能力 (含二次创新)
516 0
|
机器学习/深度学习 Serverless 索引
分类网络中one-hot编码的作用
在分类任务中,使用神经网络时,通常需要将类别标签转换为一种合适的输入格式。这时候,one-hot编码(one-hot encoding)是一种常见且有效的方法。one-hot编码将类别标签表示为向量形式,其中只有一个元素为1,其他元素为0。
691 2
|
机器学习/深度学习 人工智能 算法
【新闻文本分类识别系统】Python+卷积神经网络算法+人工智能+深度学习+计算机毕设项目+Django网页界面平台
文本分类识别系统。本系统使用Python作为主要开发语言,首先收集了10种中文文本数据集("体育类", "财经类", "房产类", "家居类", "教育类", "科技类", "时尚类", "时政类", "游戏类", "娱乐类"),然后基于TensorFlow搭建CNN卷积神经网络算法模型。通过对数据集进行多轮迭代训练,最后得到一个识别精度较高的模型,并保存为本地的h5格式。然后使用Django开发Web网页端操作界面,实现用户上传一段文本识别其所属的类别。
601 1
【新闻文本分类识别系统】Python+卷积神经网络算法+人工智能+深度学习+计算机毕设项目+Django网页界面平台

热门文章

最新文章