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

相关文章

Kotlin Map映射转换问题小结

《KotlinMap映射转换问题小结》文章介绍了Kotlin集合转换的多种方法,包括map(一对一转换)、mapIndexed(带索引)、mapNotNull(过滤null)、mapKeys/map... 目录Kotlin 集合转换:map、mapIndexed、mapNotNull、mapKeys、map

nginx中端口无权限的问题解决

《nginx中端口无权限的问题解决》当Nginx日志报错bind()to80failed(13:Permissiondenied)时,这通常是由于权限不足导致Nginx无法绑定到80端口,下面就来... 目录一、问题原因分析二、解决方案1. 以 root 权限运行 Nginx(不推荐)2. 为 Nginx

解决1093 - You can‘t specify target table报错问题及原因分析

《解决1093-Youcan‘tspecifytargettable报错问题及原因分析》MySQL1093错误因UPDATE/DELETE语句的FROM子句直接引用目标表或嵌套子查询导致,... 目录报js错原因分析具体原因解决办法方法一:使用临时表方法二:使用JOIN方法三:使用EXISTS示例总结报错原

Windows环境下解决Matplotlib中文字体显示问题的详细教程

《Windows环境下解决Matplotlib中文字体显示问题的详细教程》本文详细介绍了在Windows下解决Matplotlib中文显示问题的方法,包括安装字体、更新缓存、配置文件设置及编码調整,并... 目录引言问题分析解决方案详解1. 检查系统已安装字体2. 手动添加中文字体(以SimHei为例)步骤

SpringSecurity整合redission序列化问题小结(最新整理)

《SpringSecurity整合redission序列化问题小结(最新整理)》文章详解SpringSecurity整合Redisson时的序列化问题,指出需排除官方Jackson依赖,通过自定义反序... 目录1. 前言2. Redission配置2.1 RedissonProperties2.2 Red

nginx 负载均衡配置及如何解决重复登录问题

《nginx负载均衡配置及如何解决重复登录问题》文章详解Nginx源码安装与Docker部署,介绍四层/七层代理区别及负载均衡策略,通过ip_hash解决重复登录问题,对nginx负载均衡配置及如何... 目录一:源码安装:1.配置编译参数2.编译3.编译安装 二,四层代理和七层代理区别1.二者混合使用举例

SpringBoot+EasyExcel实现自定义复杂样式导入导出

《SpringBoot+EasyExcel实现自定义复杂样式导入导出》这篇文章主要为大家详细介绍了SpringBoot如何结果EasyExcel实现自定义复杂样式导入导出功能,文中的示例代码讲解详细,... 目录安装处理自定义导出复杂场景1、列不固定,动态列2、动态下拉3、自定义锁定行/列,添加密码4、合并

怎样通过分析GC日志来定位Java进程的内存问题

《怎样通过分析GC日志来定位Java进程的内存问题》:本文主要介绍怎样通过分析GC日志来定位Java进程的内存问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、GC 日志基础配置1. 启用详细 GC 日志2. 不同收集器的日志格式二、关键指标与分析维度1.

Java 线程安全与 volatile与单例模式问题及解决方案

《Java线程安全与volatile与单例模式问题及解决方案》文章主要讲解线程安全问题的五个成因(调度随机、变量修改、非原子操作、内存可见性、指令重排序)及解决方案,强调使用volatile关键字... 目录什么是线程安全线程安全问题的产生与解决方案线程的调度是随机的多个线程对同一个变量进行修改线程的修改操

从原理到实战深入理解Java 断言assert

《从原理到实战深入理解Java断言assert》本文深入解析Java断言机制,涵盖语法、工作原理、启用方式及与异常的区别,推荐用于开发阶段的条件检查与状态验证,并强调生产环境应使用参数验证工具类替代... 目录深入理解 Java 断言(assert):从原理到实战引言:为什么需要断言?一、断言基础1.1 语