机器学习理论基础---1

什么是机器学习

-------先观察后照做
-------机器学习算法都试图以某种它可以的方式来模拟两个数据之间存在的模式,从而做到用一个数据集来预测另一个数据集
-------机器学习的大部分工作都是训练某种监督分类器

  • 机器学习:
    机器学习是计算机科学的的一个分支,机器学习观察某个任务中存在的模式,并试图以某种直接或者间接的方式模仿它。

机器学习理论基础

机器学习工作流程的总结

  • 获取数据集:
    要有多少的样本每个样本的特征,根据特征再进行归类成相应的目标值

     1:数据要有代表性,否者会过拟合,(数据集尽量差异大,提取会更好)。
     2:对数据的分类问题,数据偏斜不能过严重,不同类别的数据数量不要有数量级的差距。
     3:对数据集的量级做一个评估,多少个样本,多少个特征,可以估算出内存的消耗,
     	太大放不下就要考虑改进算法和做一些降维的技巧,如果数据集太大,就要考虑做分布式的处理方式。
    
  • 数据集的基本处理:

     1:数据的清洗很关键的一步,能够使算法效果和性能显著的提高:
     	如归一化,离散化,因子化,缺失值的处理,去除共线性等,数据的挖掘过程就花在他们上面。
     2:数据的增强操作:翻转。
    
  • 特征工程的提取:

     1:良好的数据能过提取良好的特征才能发挥作用。
     2:筛选出显著的特征,放弃非显著的特征,非常简单的算法也能有不错的结果。
     3:需要运用有效性的分析相关的技术,相关的系数,卡方检验,平均互信息,条件熵,后验概率,逻辑回归权重等方法。
    
  • 机器学习(构建模型训练):
    训练的数据(70%-80%)测试数据集(20%-30%)

     1:怎样才能把这些算法的(超参数)使得变得更加优良,理解越深才能更有效的提出优化的方案。
    
  • 模型的评估:

     没有达到要求,从新上面的步骤
     达到一定的要求,上线服务
    

机器学习的算法分类

两种机器学习的主要类型:
数据集的组成不同,算法就有所不同

	监督和无监督主要关注被学习的模式的类型
	无监督学习和监督学习都是将一个数据集转化为另一个数据集
  • 监督学习:你知道的-----》监督学习----》你想知道的

  • 监督机器学习:创建能接收可观察,可记录的,输入数据的方法,他能将转换为所需要再进行逻辑分析的有价值的输出数据。

     他可以直接模仿两个数据集之间的模式,尝试获取一个输入数据集并将其转换为	
     对应的输出数据集:如使用像素来检测猫存在与否
    
  • 监督学习对数据集进行转换

  • 监督学习是一种将一个数据集转换为另一个数据集的方法

     1:输入数据是由输入特征和目标值所组成的:
      	(一):函数的输出可以是一个连续的值(称为回归)
      	(二):或是输出是个有限的离散值(称为分类)
    
  • 无监督学习:一系列的数据点-----》无监督学习-----》一系列的数据聚类标签。

  • 将数据集进行聚类就是一种无监督学习: 聚类算法:将一系列数据点转换为对应的一系列类别的标签。

  • 无监督学习对数据集进行分组

     1:输入数据是由输入特征值组成,没有目标值:
     	(一):输入数据没有被标记,也没有确定的结果,数据类别未知
     	(二):需要根据样本间的相似性对样本进行类别的分类
    
  • 半监督学习

     1:训练集同时含有标记的数据和未标记的数据样本
    
  • 强化学习:

     1:实质是make decisions 问题,即自动进行决策,并且可以做练习决策
       (一):五个元素:代理品,行动,奖励,环境,观察情况
       (二):强化学习目标是获取最多的累计奖励
    

    四种不同类型的算法:监督或者无监督,参数或者无参数

  • 监督和无监督的特性是:主要关注被学习的模式的类型

  • 参数和非参数类型:主要关注存储学习参数的方式

    参数学习和非参数学习

  • 参数学习和非参数学习:试错学习和计数和概率
    参数是一种通用的术语,所指的仅是用于识别模式的-组数字–并不影响限制我们我们第一这些数字的正常使用,
    技术的参数权重是参数

     主要关注存储学习参数的方式,更进一步说是关注学习的方法
     参数模型的特征是具有固定的数量的参数,而非参数的参数数量是无限的(由数据决定)
     	1:参数模型倾向于试错法
     	2:非参数模型倾向于计数法
    

    监督学习和强化学习的对比

     反馈映射: 	
     	监督学习:输出的是之间的关系,可以告诉算法什么样的输入对应着什么样的输出。 	
     	强化学习:输出的是给机器的反馈 reward function,即用来判断这个行为是好是坏。
     反馈时间 	
     	监督学习:做了比较坏的选择会立刻反馈给算法。 	
     	强化学习:结果反馈有延时,有时候可能需要走了很多步以后才知道以前的某一步的选择是好还是坏。
     输入特征 	
     	监督学习:输入是独立同分布的。 	
     	强化学习:面对的输入总是在变化,每当算法做出一个行为,它影响下一次决策的输入,一直在变化的
     
     拓展概念:什么是独立同分布:
    

监督参数学习:使用旋钮进行试错学习

  • 机器根据旋钮的角度对输入数据进行处理,并转换为预测结果

预测—与真值进行比较----学习模式
通过调节参数来达到最好的预判结果

无监督参数学习

无监督参数学习就是就是使用旋钮对数据经行分组,每个类别都设置了几个旋钮,每个旋钮都反映了输入数据到那个特等类别的相似度

非参数学习:基于计数的方法

  • 参数算法有固定数量的参数,而非参数算法会根据数据集调整参数个数

神经网络:它将输入乘以权重,将输入“缩放”一定比例

数据-------机器------预测
预测------比较------学习—>模式
神经网络做了:

 将输入乘于权重
 将输入缩放一定比例

神经网络的交互:

  接受输入变量,作为信息来源, 
  拥有权重变量,以此作为知识,
  然后融入信息和知识,输出预测结果

理解神经网络权重:

是将它作为网络的输入和预测之间敏感度的度量,

权重非常的高,即使最小的输入也会对预测结果产生非常大的影响,权重非常小时再大的输入也只能对预测产生很小的扰动

多种输入

将三个输入或更多输入乘于三项权重,并使他们求和得到加权后的权和

加权和(点积)

将每个输入乘于其各自的权重,然后对所有的局部预测结果进行求和则成为输入的加权和,简称点积

点积

 点积让你了解两个向量之间的相似性,
 最大的加权和:出现在完全相同的向量之间
 向量之间没有重合的权重,点积为0
 重合的权重值为负数,这个会抵消掉他们之间的正相似性

点积的属性

点积的属性类比作逻辑上的AND(与)操作,向量中没有相同的,最终得分为0
负权重值往往意味着逻辑上的NOT(非)运算符,因为任何正权值与负权值配对都会导致得分下降,两个为负的就会得正值

OR(或)如果任何一行的权重不为0,分数就会受到影响

简单的神经网络

import numpy as np存储的维度元素数组
weights = np.array([0.1,0.2,0])#数值为权重
#array:为NP中的存储元组的维度
def neural_network(input,weights)
	pred = input.dot(weights)#dot:为Numpy中的乘
	returu pred
toes = np.array([8.5,9.5,9.9,9.0])#数值为输入信息数据
wlrec = np.array([0.65,0.8,0.8,0.9])
nfans = np.array([1.2,1.3,0.5,1.0])
input = np.array(toes[0],wlerc[0],nfans[0])
pred = neural_network(input,weights)
print(pred)

误差

预测出来的结果与实际中的结果存在着多少的误差

  • 均方误差:是评估神经网络准确性的众多方法之一
  • 比较是在逻辑上的输出是“冷/热”这一类信号
  • 提升权重:up_prediction = input*(weight+step_amount)#step_amount=0.001(增加权重值)

学习

  • 学习:就是告诉权重应该如何改变以及降低误差,深度学习最流行的方法为:梯度下降,在预测步骤结束时:学习这一步会为每项权重计算一个数字,这个数字告诉我们,减少误差,权重应该向那个方向变化,然后,我们根据这个数字对权重做出相应的调节,直到达到目的。
  • 学习:学习就是调整权重,将误差减小到0

比较

这一步会让你知道自己的模型错了多少

  • 比较:你是的神经网络是否做好的预测

测量误差

  • 训练神经网络的目的是做出正确的预测
  • 纯误差:((权重输入数据)- 真实数据)
    -均方误差:((权重
    输入数据)- 真实数据)**2 将误差进行平方,进负数的误差进行正值,和将更大的误差更大,更小的误差更小(小于1的数更小,大于1的数更大)
  • 冷热学习:就是通过扰动权重从新确定向那个方向调整可以使得误差的降低幅度最大,基于此将权重值向那个方向移动
    权重实际进行调节取决于那个方向所得到的误差更小
  • 执行缩放,负值翻转和停止调节对纯误差进行修正以及更新权重((权重*输入)- 真实数据)× 输入数据
  • 缩放,停止,负值反转:三个属性作用进纯误差转换为我们需要的权重调节的绝对幅度
weight = 0.5#权重
input = 0.5#数据
goal_prediction = 0.8#真实的值(goal_pred:真值)
step_amount = 0.001#权重增加的值
for iteration in range(1101):#循环迭代预测
predidction = input * weight #预测出来的值
weight_delta(误差增量就是你的导数)
error = (predidction - goal_prediction)**2#误差值进行平方
print("Error:"+ str(error) + "predidction:" + str(predidction))#
up_prediction = input * (weight + srep_amount)
up_error = goal_prediction - up_prediction)**2
down_predicton = input * (weight - dtep_amount)
down_error =(goal_prediction - down_prediction)**2
if (down_error < up_error):
	weight = weight - step_amount
if (down_error > up_error):
	weight = weight + step_amount

梯度下降:

更新出来的新权重的值(weight):(((权重 × 输入)- 真实数据)× 输入)× 训练之前确定的权重增量的值(alpha)

alpha:调节控制网络学习的速度。
测量误差,找出权重调节的方向和幅度,对方向和幅度的计算,对权重进行调整以减少错误
direction_and_amount = (pred - goal_pred) * input
#纯误差,
#与输入相乘,用于执行缩放,负值反转和停止调节,对纯误差进行修正以更新权重

  • 预测的数据(pred):权重*输入

  • 输出节点(delta):(权重*输入)- 真实数据(delta)
    :当前节点的变化以便完美第预测结果

  • 误差的增量(weight_delta):((权重*输入)- 真实数据)× 输入数据:将权重的输出节点增加(delta)乘以权重的输入,进行权重缩放操作
    :基于导数对权重移动的方向和数量的估计

  • 原始权重 - 权重的增量

  • 更新出来的新权重的值(weight):(((权重*输入)- 真实数据)× 输入)× 训练之前确定的权重增量的值(alpha)
    纯误差:预测值和真实值的差值,表示当前的错误的原始方向和幅度,如果是一个正值,那么预测就太高了,反之亦然,如果很大的数字那么就错了很多
    停止调节:例子CD碟片插入立体播放机,把音量调到最大,但是CD播放器是关着的,就是输入为0时,模型就不会进行学习,所有的权重值都会产生相同的误差,对其进行调节没有什么区别,预测的一直为0,
    负值翻转:当输入为负值时纯误差也为负值,再进与输入相乘,权重向着正值方向前进
    缩放:是对纯误差进行第三项修正,是输入引起,如果输入很大,则权重更新也会变得更大,就相当于副作用,进程可能失去控制,
    权重修改:权重的修改,能够使预测的值之间的误差逐渐接近于0,达到预测值和真实值无限接近


weight,goal_pred,input = (0.0,0.8,1.1)#权重, 真实值,  输入
for iteration in range(4):
    print("----\nWeight:" + str(weight))
    pred = input*weight  #输入乘权重预测值
    error = (pred - goal_pred)**2#预测值-真实值的平方:均方误差
    delta = pred - goal_pred#纯误差
    weight_delta = delta * input#反转预测后的值数
    weight = weight - weight_delta#节点delta值,实际误差与反转后判定的进行相互补
    print("Error:"+str(error)+"prediction:"+str(pred))
    print("delta:"+str(delta)+"weight delta:"+str(weight_delta))

误差减小

为了使误差减小,我们尽力去寻求权重应该变化的方向和幅度,导数给出了函数中任意两个变量之间的关系,我们可以用导数来确定权重和误差之间的关系,然后把权重的值向导数的反方向移动,就能得到使误差更小的权重值。

学习就是减少误差

  1. 可以修改权重减少误差:就是找到正确的方向和幅度来改变权重,使误差减小
  2. 原始权重 - 权重的增量
  3. 用斜率来帮助神经网络减少的误差:不管你在碗型曲线的那个位置,斜率都指向碗的底部(此时误差最小)

学习就是调整权重将误差减小到0

  1. 改变权重值误差的变化就是变化量
  2. 给定一个函数,如果你改变其中一个变量,则它的导数代表了另一个变量发生变化的方向和幅度
  3. 导数是直线或者曲线上的一点斜率
  4. 画出U型曲线:曲线的斜率是正值,这个点就在右边,曲线的斜率为负值
  5. 斜率的符号表示方向,斜率的坡度表示量你可以使这两个方法来帮助我们找到目标权重
  6. 导数代表着,某个函数中两个变量之间的关系
  7. 误差的增量就是你的导数(weight_delta**):((权重*输入)- 真实数据)× 输入数据:将权重的输出节点增加(delta)乘以权重的输入,进行权重缩放操作,
  8. 画出来的虚色直线是斜率,也是导数,当改变权重时误差会跟着变化多少,如果方向是朝下的,也就说斜率就是负的
  9. 直线或曲线的斜率总是与error最低点的方向相反,所以斜率是负的就增加weight寻求最小的error

深度学习的目标

  1. 就是误差的减小,尽力寻求权重应该变化的方向和幅度,可以用导数来确定权重和误差之间的关系,然后再把权重的值再向导数的反方向移动,就能得到使误差更小的权重值

引用α

  1. α又名alpha:能够减少权重的增量,取值范围0到1之间
    把 weight_delta 变量名替换成derivative
    2.*更新出来的新权重的值: weight = weight - (alpha * derivative)

引用α变量

weight = 0.5#权重
goal_pred = 0.8#真实值
input = 2.0#输入值
alpha = 0.1#α值
for iteration in range(20):
    pred = input * weight#预测值
    error = (pred - goal_pred)**2#误差值(均方误差)
    derivative = input * (pred - goal_pred)#误差增量:输入数据乘(预测值减去真实值)
    weight = weight - (alpha * derivative )#更新后的权重:权重值减去(误差增量乘a值)
    print("Error:" +str(error) + "Predicton:" + str(pred))

一直更新的权重值

weight(一直更新权重值) =初始权重值 – [ {(【预测值:(输入值×权重值)】减去–【真实值】)×【输入值】} × 【α】]

  1. 预测值 = 输入值×权重值
  2. 误差增量 = (预测值 – 真实值)× 输入值
  3. 更新权重值 = 权重值 - (α × 误差增量)
def w_sum(a,b):
    assert (len(a) == len(b))#断言:assert:如不相等则抛出异常
    output = 0#建立一个空变量
    for i in range(len(a)):
        output += (a[i] * b [i])#权重与输入的数据
        return output
weights = [0.1,0.2,-1]#权重a


def neural_network(input,weights):
    pred = w_sum(input,weights)#调用了上例的方法
    return pred#返回了预测的值

#预测和比较:做出预测,计算误差和增量
toes = [8.5,9.5,9.9,9.0]#踢进去的球
wlrec = [0.65,0.8,0.8,0.9]#胜率的百分比
nfans = [1.2,1.3,0.5,1.0]#粉丝的数量
win_or_lose_binary = [1,1,0,1]#四队的真实值
true = win_or_lose_binary[0]#遍历调用列表值
input = [toes[0],wlrec[0],nfans[0]]#输入遍历的值
pred =neural_network(input,weights)#调用方法
error = (pred - true) ** 2#误差值
delta = pred - true#纯误差,预测值-真实值

#学习计算权重增量,将它应用对应的权重上

def ele_mul(number,vector):#误差的增量,权重误差乘于输入值
    output = [0,0,0]#值的增量
    assert (len(output) == len(vector))
    for i in range(len(output)):
        output[i] = number * vector[i]#更新权重的误差值,纯误差乘于输入值
    return output

input = [toes[0],wlrec[0],nfans[0]]#输入值
pred =(pred - true) ** 2#均方误差
delta = pred - true#纯误差
weight_deltas = ele_mul(delta,input)#调用方法

#学习:更新权重

input = [toes[0],wlrec[0],nfans[0]]
pred = neural_network((input,weights))
error = (pred - true) ** 2
delta = pred - true
weight_deltas = ele_mul(delta,input)
alpha = 0.1#alpha防止权重过度修正
for i in range(len(weights)):
    weights[i] -= alpha*weight_deltas[i]
    print("weights:"+str(weights))
    print("weights Deltas:"+str(weight_deltas))


#先用方法构成预测数值
def neursl_network(input,weights):
    out = 0
    for i in range(len(input)):
        out += (input[i]*weights[i])#预测的值
    return out

#预测值乘于输入值,
def ele_mul(scalar,vector):
    out = [0,0,0]#有4队但是只有测出来的三个类型
    for i in range(len(out)):
        out[i] = vector[i] * scalar
    return out

# 输入数据
toes = [8.5,9.5,9.9,9.0]
wlrec = [0.65,0.8,0.8,0.9]
nfans = [1.2,1.3,0.5,1.0]

# 真实数据
win_or_lose_binary = [1,1,0,1]

true = win_or_lose_binary [0]
alpha = 0.01
weights = [0.1,0.2,-0.1]#权重值
input = [toes[0],wlrec[0],nfans[0]]

for iter in range(3):
    pred = neursl_network(input,weights)
    error = (pred - true)**2#均方误差值
    delta = pred - true#纯误差值
    weight_deltas = ele_mul(delta,input)
    print("Iteration:" + str(iter+1))
    print("pred:"+ str(pred))
    print("eeore"+ str(error))
    print("delta:"+ str(delta))
    print("weights:",str(weights))
    print("weight_deltas",weight_deltas)

    #更新权重值
    for i in range(len(weights)):
        weights[i] -= alpha*weight_deltas[i]

具有多个输入和输出的梯度下降

一次学习多个权重值

每个单独权重对于全局误差所产生的影响的度量,因此,因为误差是共享的,当一项权重达到U型曲线的底部时,所有的权重都会达到U型的底部

权重A可能对应着重要的数据,对预测有着举足轻重的影响,但如果网络在训练中意外的找到一种不需要它也可能准确推断预测的情况,那么权重A则不将对预测结果产生任何影响。

误差由训练数据决定,任何网络的权重都可以任意取值,但给定任意特定权重的设置后,则误差值百分百由数据决定。

具有多输入的梯度下降学习

神经网络也可以用一个输入做多个预测

一张图片(28×28)的像素矩阵输入到一维的神经网络中----》把图片的压成一个1×784的向量,抽出第一行的像素值,再首尾相连,得到一个一维的像素列表(784像素长)

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

枭玉龙

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值