7.人工智能原理-高维空间:机器如何面对越来越复杂的问题

本文主要是介绍7.人工智能原理-高维空间:机器如何面对越来越复杂的问题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

一、高维度

二、线性不可分

三、TensorFlow游乐场

四、向量、矩阵、张量

五、编程实验

六、总结

七、往期内容


一、高维度

       如果我们想要去判断一个人是否善于打篮球,很明显,仅仅考虑他的身高特征是不合理的。虽然这个特征很关键,但还需要从其他的角度去分析,比如体重、身体灵活性以及是否经常见到凌晨四点钟的太阳等等因素。

高维:同样,在之前的课程中,为了让大家更加清晰的了解神经网络的工作原理,一直仅仅在用豆豆大小这个特征去预测它的毒性,但现实世界往往并非如此简单。比如豆豆的毒性不仅和它的大小有关系,也和它的颜色深浅有关。当毒性只和大小有关系的时候,我们可以用一个二维的坐标系来描述这个关系。那此刻加入一个颜色深浅的特征该如何用图像描述?

       这个线性函数的平面经过神经元的第二部分非线性激活函数之后,就被扭曲成为一个S型的曲面,正如一元一次函数的直线被激活函数扭曲成为一个S形曲线一样,那么这个曲面就表示当大小和颜色深浅取某个值的时候对有毒概率的预测结果。

而当我们找到这个预测曲面上,预测值为0.5的点连接在一起,用地理里的概念来说就是高度为0.5的等高线,你会发现是一条直线,这条直线的一边的预测结果大于0.5,也就是有毒,而另一边的预测结果小于0.5,也就是无毒。而当我们从上往下看俯视图效果的时候,这个0.5的等高线也就是大家可能在很多教程或书上看到过的类型分割线实际上在之前的一元数和有毒概率形成的二维函数中也有一个0.5的等高线,只不过在二维空间中它退化成为了一个点,你可以称之为等高点,而这个等高点同样是两类豆豆的分割点,本质上是一样的。

而通过不断的调整权重参数w1、w2以及偏置参数b,可以让这个预测模型的0.5等高线顺利的分割出有毒和无毒两类豆豆。

二、线性不可分

       如果环境中豆豆的大小、颜色、深度和毒性分布是这样一个情况,那就无能为例了,这就是所谓的线性不可分问题。

       那如何解决线性不可分问题?而解决的办法我们也说过,那就是在添加隐藏层神经元。通过调整这些神经元的参数,最终把曲面扭曲成为这个样子,0.5的等高线也被扭曲成为这个样子,如此就解决了这种弯曲数据分布的分类问题。

💡思考:下面这个二维输入需要几个隐藏神经元可以让分割线形成一个圈?

在这里插入图片描述

        输入数据有多少元素,也就是所谓的特征维度,也叫数据维度,从一维的大小数据到二维的大小,颜色深浅数据,再到更高维度的数据,实际上我们把豆豆的特征提取的越多,也就是说我们从更多的维度去观察问题的时候,也就能够更好的预测它的毒性。

三、TensorFlow游乐场

        大家可从打开谷歌的tensorflow游乐场,送择这个圆圈形状的数据集,手动添加神经元,验证自己的想法;tensorflow游乐场地址: http://playground.tensorflow.org/

四、向量、矩阵、张量

        一维数据为向量,二维的数据为矩阵,三维以后的数据,称之为张量。在机器学习课程里,可以直接把张量理解为多维的数据就好了。正如著名的并且以张量命名的机器学习框架tensorflow的文档里写的那样,这句话说的很明白,张量是向量和矩阵向更高维度的推广

五、编程实验

        本次的编程实验,我们主要来实现一个接收2个输入的神经元,也就是豆豆的输入数据特征维度为2。

 1.导入豆豆数据集dataset.py

import numpy as npdef get_beans(counts):xs = np.random.rand(counts,2)*2ys = np.zeros(counts)for i in range(counts):x = xs[i]if (x[0]-0.5*x[1]-0.1)>0:ys[i] = 1return xs,ysdef get_beans2(counts):xs = np.random.rand(counts,2)*2ys = np.zeros(counts)for i in range(counts):x = xs[i]if (np.power(x[0]-1,2)+np.power(x[1]-0.3,2))<0.5:ys[i] = 1return xs,ys

2.  绘图工具封装:plot_utils.py

import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import numpy as npdef show_scatter(xs,y):x = xs[:,0]z = xs[:,1]fig = plt.figure()ax = Axes3D(fig)ax.scatter(x, z, y)plt.show()def show_surface(x,z,forward_propgation):x = np.arange(np.min(x),np.max(x),0.1)z = np.arange(np.min(z),np.max(z),0.1)x,z = np.meshgrid(x,z)y = forward_propgation(x,z)fig = plt.figure()ax = Axes3D(fig)ax.plot_surface(x, z, y, cmap='rainbow')plt.show()def show_scatter_surface(xs,y,forward_propgation):x = xs[:,0]z = xs[:,1]fig = plt.figure()ax = Axes3D(fig)ax.scatter(x, z, y)x = np.arange(np.min(x),np.max(x),0.01)z = np.arange(np.min(z),np.max(z),0.01)x,z = np.meshgrid(x,z)y = forward_propgation(x,z)ax.plot_surface(x, z, y, cmap='rainbow')plt.show()

 3. 梯度下降

import numpy as np
import dataset
import plot_utilsm = 100
xs, ys = dataset.get_beans(m)
print(xs)
print(ys)plot_utils.show_scatter(xs, ys)w1 = 0.1
w2 = 0.2
b = 0.1## [[a,b][c,d]]
## x1s[a,c]
## x2s[b,d]
## 逗号,区分的是维度,冒号:区分的是索引,省略号… 用来代替全索引长度
# 在所有的行上,把第0列切割下来形成一个新的数组
x1s = xs[:, 0]
x2s = xs[:, 1]# 前端传播
def forward_propgation(x1s, x2s):z = w1 * x1s + w2 * x2s + ba = 1 / (1 + np.exp(-z))return a
#画出豆豆的散点图和预测曲面
plot_utils.show_scatter_surface(xs, ys, forward_propgation)#梯度下降
for _ in range(500):for i in range(m):x = xs[i] ## 豆豆特征y = ys[i] ## 豆豆是否有毒x1 = x[0]#第一列x2 = x[1]#第二例a = forward_propgation(x1, x2)e = (y - a) ** 2deda = -2 * (y - a)dadz = a * (1 - a)dzdw1 = x1dzdw2 = x2dzdb = 1dedw1 = deda * dadz * dzdw1dedw2 = deda * dadz * dzdw2dedb = deda * dadz * dzdbalpha = 0.01w1 = w1 - alpha * dedw1w2 = w2 - alpha * dedw2b = b - alpha * dedbplot_utils.show_scatter_surface(xs, ys, forward_propgation)

得出图片

 

 

 

六、总结

        本节课介绍多维特征数据输入,机器学习如何进行分类,同时还介绍线性不可分割问题,此时需要添加隐藏层神经元,通过调整这些神经元的参数,最终曲面扭曲,形成0.5的等高线。当输入数据的维度越来越多的时候,我们会发现权重参数也越来越多,如果一个个的去编写它们的函数表达式,未免有点麻烦和拖沓。所以我们将在下一节课给大家介绍专门用来处理多维度数据的数学工具向量和矩阵学会使用向量和矩阵在机器学习和神经网络中十分重要。在下一节课开始,我们将逐渐走出这些底层的原理分析,直接采用keras框架实现神经网络的搭建。彼时,我们不再需要处理前向传播,也不再需要手写反向传播,甚至梯度下降的细节也会被框架隐藏起来。但我们唯一逃不脱的就是对矩阵和向量的使用。即使在日后的工作和学习中,作为工程人员而不是科研人员化身调参匣,我们还是要熟练的使用矩阵和向量处理问题。然而好消息是,向量和矩阵都很简单,从功课的角度来看,可以说是众多数学分支里最简单,而我们的课程里用到的相关知识就是最基础和精简的部分。

七、往期内容

 引言:来一场人工智能的奇妙冒险吧~

1.一元一次函数感知器:如何描述直觉

2.方差代价函数:知错

3.梯度下降:能改

4.曲面梯度下降和反向传播:能改

5.激活函数:给机器注入灵魂

6.隐藏层:神经网络为什么working

7.高维空间:机器如何面对越来越复杂的问题

8.初识Keras:轻松完成神经网络模型搭建

9.深度学习:神奇的DeepLearning

10.卷积神经网络:打破图像识别的瓶颈

11. 卷积神经网络:图像识别实战

12.循环:序列依赖问题

13.LSTM网络:自然语言处理实践

14.机器学习:最后一节课也是第一节课

视频链接:https://pan.baidu.com/s/183EfvqVYDUuXIuDmg8xV0A?pwd=h3tc

可视化工具链接:https://pan.baidu.com/s/1SKG4QK2HymdoriyNdkyGzA?pwd=3bav

可视化工具链接包括:2dim_input_neural.html

这篇关于7.人工智能原理-高维空间:机器如何面对越来越复杂的问题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/652756

相关文章

Python中使用uv创建环境及原理举例详解

《Python中使用uv创建环境及原理举例详解》uv是Astral团队开发的高性能Python工具,整合包管理、虚拟环境、Python版本控制等功能,:本文主要介绍Python中使用uv创建环境及... 目录一、uv工具简介核心特点:二、安装uv1. 通过pip安装2. 通过脚本安装验证安装:配置镜像源(可

MySQL 设置AUTO_INCREMENT 无效的问题解决

《MySQL设置AUTO_INCREMENT无效的问题解决》本文主要介绍了MySQL设置AUTO_INCREMENT无效的问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参... 目录快速设置mysql的auto_increment参数一、修改 AUTO_INCREMENT 的值。

关于跨域无效的问题及解决(java后端方案)

《关于跨域无效的问题及解决(java后端方案)》:本文主要介绍关于跨域无效的问题及解决(java后端方案),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录通用后端跨域方法1、@CrossOrigin 注解2、springboot2.0 实现WebMvcConfig

Go语言中泄漏缓冲区的问题解决

《Go语言中泄漏缓冲区的问题解决》缓冲区是一种常见的数据结构,常被用于在不同的并发单元之间传递数据,然而,若缓冲区使用不当,就可能引发泄漏缓冲区问题,本文就来介绍一下问题的解决,感兴趣的可以了解一下... 目录引言泄漏缓冲区的基本概念代码示例:泄漏缓冲区的产生项目场景:Web 服务器中的请求缓冲场景描述代码

Java死锁问题解决方案及示例详解

《Java死锁问题解决方案及示例详解》死锁是指两个或多个线程因争夺资源而相互等待,导致所有线程都无法继续执行的一种状态,本文给大家详细介绍了Java死锁问题解决方案详解及实践样例,需要的朋友可以参考下... 目录1、简述死锁的四个必要条件:2、死锁示例代码3、如何检测死锁?3.1 使用 jstack3.2

解决JSONField、JsonProperty不生效的问题

《解决JSONField、JsonProperty不生效的问题》:本文主要介绍解决JSONField、JsonProperty不生效的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑... 目录jsONField、JsonProperty不生效javascript问题排查总结JSONField

MySQL复杂SQL之多表联查/子查询详细介绍(最新整理)

《MySQL复杂SQL之多表联查/子查询详细介绍(最新整理)》掌握多表联查(INNERJOIN,LEFTJOIN,RIGHTJOIN,FULLJOIN)和子查询(标量、列、行、表子查询、相关/非相关、... 目录第一部分:多表联查 (JOIN Operations)1. 连接的类型 (JOIN Types)

github打不开的问题分析及解决

《github打不开的问题分析及解决》:本文主要介绍github打不开的问题分析及解决,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、找到github.com域名解析的ip地址二、找到github.global.ssl.fastly.net网址解析的ip地址三

MySQL版本问题导致项目无法启动问题的解决方案

《MySQL版本问题导致项目无法启动问题的解决方案》本文记录了一次因MySQL版本不一致导致项目启动失败的经历,详细解析了连接错误的原因,并提供了两种解决方案:调整连接字符串禁用SSL或统一MySQL... 目录本地项目启动报错报错原因:解决方案第一个:第二种:容器启动mysql的坑两种修改时区的方法:本地

springboot加载不到nacos配置中心的配置问题处理

《springboot加载不到nacos配置中心的配置问题处理》:本文主要介绍springboot加载不到nacos配置中心的配置问题处理,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑... 目录springboot加载不到nacos配置中心的配置两种可能Spring Boot 版本Nacos