可以多分类的神经网络

简介: ''' 11行神经网络① 层数可变,多类 ''' import numpy as np import matplotlib.pyplot as plt class BPNN(object): def __init__(self, neurals, epsilon=0.

 

'''
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()

    

 

目录
相关文章
|
3月前
|
数据采集 Web App开发 自然语言处理
新闻热点一目了然:Python爬虫数据可视化
新闻热点一目了然:Python爬虫数据可视化
|
3月前
|
安全 Shell Linux
深入剖析Sudo提权:白帽子的防御视角与审计指南
本文深入解析Linux系统中`sudo`提权的常见手法,从白帽子视角出发,剖析攻击原理并提供实用防御与审计策略,助力加固系统权限安全。
394 1
|
4月前
|
机器学习/深度学习 人工智能 PyTorch
三周内转型AI工程师学习计划
3周AI转型计划:掌握数学、机器学习与深度学习基础,熟练使用Python、PyTorch/TensorFlow。完成2-3个CV/NLP项目,构建GitHub博客,强化LeetCode刷题与模拟面试。每日高效学习9小时,聚焦实战与面试准备,助力快速入行AI。
273 0
|
6月前
|
C++
爱心代码 C++
这段C++代码使用EasyX图形库生成动态爱心图案。程序通过数学公式绘制爱心形状,并以帧动画形式呈现渐变效果。运行时需安装EasyX库,教程链接:http://【EasyX图形库的安装和使用】https://www.bilibili.com/video/BV1Xv4y1p7z1。代码中定义了屏幕尺寸、颜色数组等参数,利用随机数与数学函数生成动态点位,模拟爱心扩散与收缩动画,最终实现流畅的视觉效果。
869 0
|
9月前
|
5G 网络架构 UED
网速只拼Mbps?解码网速真相的五大关键因素
Mbps(兆比特每秒)是衡量数据传输速度的单位,表示每秒传输的百万比特数。它是评估网络性能的核心指标,广泛应用于家用宽带、移动网络和企业级网络中。Mbps 数值越高,理论上数据传输越快,但实际体验还受网络拥塞、丢包率和信号强度等因素影响。例如,在网络高峰时段或信号较弱的地方,即使Mbps数值高,也可能出现卡顿。5G和光纤技术显著提升了Mbps速率,但仍需考虑硬件设备如路由器和网卡的性能瓶颈。理解Mbps及其影响因素,有助于用户选择合适的网络服务并优化网络体验。
931 1
|
存储 C语言 开发者
C 语言指针与内存管理
C语言中的指针与内存管理是编程的核心概念。指针用于存储变量的内存地址,实现数据的间接访问和操作;内存管理涉及动态分配(如malloc、free函数)和释放内存,确保程序高效运行并避免内存泄漏。掌握这两者对于编写高质量的C语言程序至关重要。
389 11
ly~
|
人工智能 搜索推荐 自动驾驶
人工智能的应用
人工智能在多个领域广泛应用,包括:医疗领域的疾病诊断、药物研发和医疗机器人;交通领域的自动驾驶和智能交通管理;金融领域的风险评估、金融诈骗检测和投资决策;教育领域的个性化学习和智能辅导;工业领域的质量检测和生产流程优化;家居领域的智能家居系统,如智能音箱和智能灯具等,极大提升了各行业的效率与服务质量。
ly~
865 1
|
存储 安全 网络安全
云计算与网络安全:云服务、网络安全、信息安全等技术领域的探讨
随着云计算技术的迅速发展,越来越多的企业和个人开始使用云服务。然而,云计算在带来便利的同时,也带来了一系列的网络安全问题。本文将从云计算的基本概念出发,深入探讨云计算与网络安全的关系,包括云服务的安全问题、网络安全防护措施以及信息安全的重要性。同时,本文还将通过代码示例,展示如何在云计算环境下进行有效的网络安全防护。
|
人工智能 搜索推荐 UED
Bot 商店 + 一键优化提示词 Prompt,开启AI新体验!| Botnow上新
Botnow 迎来了重大更新,新增了 Bot 商店功能,并优化了 Bot 编排,提升了 AI 使用效率。用户可在 Bot 商店中轻松浏览和体验各类官方及用户发布的 Bots,并可一键发布或下架自己的 Bot。此外,还推出了一键优化 Prompt 功能,帮助用户生成清晰、精准的指令,提升对话质量。新老用户快来体验吧![链接]
532 5