100天精通机器学习(X)

于2019年10月弃坑

基于知乎用户微调所提出的学习路线的机器学习学习日记

(自下而上)

李宏毅机器学习与python基础语法

全方位学习

test=20
print((test>18)and(test<21),(test<10)or(test<21))
#and or 关键词
print('a' in alfa,'b' not in alfa)
#in,not in

True True
True True

if test<=4:
    test+=4;
elif test<10:
    test+=10;
else:
    test-=20;
print(test)

0
elif的使用

alien_0={'color':'green','point':5,'x':10,'y':10};
print(alien_0)
alien_0['character']='usual';
print(alien_0)
del alien_0['character']
print(alien_0)
for k,v in alien_0.items():
    print("Key:"+k+"\n"+"Value:"+str(v));
for k in sorted(alien_0.keys(),reverse=True):
    print(k)
for v in set(alien_0.values()):
    print(v)

{'color': 'green', 'point': 5, 'x': 10, 'y': 10}
{'color': 'green', 'point': 5, 'x': 10, 'y': 10, 'character': 'usual'}
{'color': 'green', 'point': 5, 'x': 10, 'y': 10}
Key:color
Value:green
Key:point
Value:5
Key:x
Value:10
Key:y
Value:10
y
x
point
color
green
10
5

alien_0={'color':'green','point':5}
alien_1={'color':'yellow','point':10}
alien_2={'color':'red','point':15}

aliens={0:alien_0,1:alien_1,2:alien_2}
#将字典放入列表中
print(aliens)
aliens=[alien_0,alien_1,alien_2]
#将字典放入字典中
print(aliens)
favorite_language={
    'jen':['python','ruby'],
    'sarah':['c'],
    'edward':['ruby','go'],
    'phil':['python','haskell']
}
print(favorite_language)

{0: {'color': 'green', 'point': 5}, 1: {'color': 'yellow', 'point': 10}, 2: {'color': 'red', 'point': 15}}
[{'color': 'green', 'point': 5}, {'color': 'yellow', 'point': 10}, {'color': 'red', 'point': 15}]

message=input("repeat:")
print(message);
age='21'
if int(age)>18:
    print('adult')

repeat:1
1
adult

alfa=['1','d','er','q4w3','q','a','i']
beta=[]
while alfa:
    beta.append(alfa.pop())
print(beta)

['i', 'a', 'q', 'q4w3', 'er', 'd', '1']

持续十几天的停滞

重新拥有效率
接纳自己、做好减法
明白自己的能力边界,在边界内做到最好

alfa=[]
alfa.append('honda')
alfa.append('aaa')
del alfa[0]
alfa.append('bbb')
alfa.append('ccc')
x=alfa.pop()
print(alfa,x)
alfa.append('bbb')
x=alfa.pop(0)
print(alfa,x)
alfa.remove('bbb')
alfa

['aaa', 'bbb'] ccc
['bbb', 'bbb'] aaa
['bbb']

alfa=['1','d','er','q4w3','q','a','i']
alfa.sort()
print(alfa)
alfa.sort(reverse=True)
print(alfa)
alfa=['1','d','er','q4w3','q','a','i']
print(sorted(alfa),alfa,sorted(alfa,reverse=True))
alfa.reverse()
print(alfa,len(alfa))

['1', 'a', 'd', 'er', 'i', 'q', 'q4w3']
['q4w3', 'q', 'i', 'er', 'd', 'a', '1']
['1', 'a', 'd', 'er', 'i', 'q', 'q4w3'] ['1', 'd', 'er', 'q4w3', 'q', 'a', 'i'] ['q4w3', 'q', 'i', 'er', 'd', 'a', '1']
['i', 'a', 'q', 'q4w3', 'er', 'd', '1'] 7

for a in alfa:
 print(a.title())

I
A
Q
Q4W3
Er
D
1

for i in range(0,len(alfa)-1):
    alfa[i]=alfa[i].title();
print(alfa)

['I', 'A', 'Q', 'Q4W3', 'Er', 'D', '1']

num=list(range(1,10,2))
alfa=[]
for nu in num:
    alfa.append(nu**2)
print(alfa,min(alfa),max(alfa),sum(alfa))
alfa=[nu**2 for nu in num]
print(alfa)

[1, 9, 25, 49, 81] 1 81 165
[1, 9, 25, 49, 81]

import timeit
t1=timeit.timeit('sum(range(1,1000001))',number=1);
print(t1);

0.039474299999994855

alfa=['1','d','er','q4w3','q','a','i']
print(alfa[2:5],alfa[:3],alfa[2:],alfa[-2:])

['er', 'q4w3', 'q'] ['1', 'd', 'er'] ['er', 'q4w3', 'q', 'a', 'i'] ['a', 'i']

for al in alfa[3:]:
    print(al.title())
beta=alfa[-4:];
beta1=alfa[:]
print(beta,beta1)

Q4W3
Q
A
I
['q4w3', 'q', 'a', 'i'] ['1', 'd', 'er', 'q4w3', 'q', 'a', 'i']

const=(1,2,3,4);
#元组,赋值来修改
const=(1,2)

长达三四天的混乱

测试集的错误来自哪里?

首先我们明白我们训练出的模型是随机的
训练出的模型的参数在最优的模型的参数周围分布
所有现实的训练集有一个假定的实际模型

因此训练出的方程的错误主要有两个方面

  • 一方面是函数集合中的最优模型与实际模型的误差
  • 一方面是训练模型与最优模型的误差

一般越是简单的函数的集合,训练模型越容易拟合至最优模型,
但实际模型可能不被简单的函数模型包括,最优模型与实际模型的差距很大
一般越是复杂的函数的集合,训练模型很难拟合到最优模型
但复杂的函数能包括很多模型,最优模型离实际模型越近
前者容易产生偏差(bias),后者容易产生方差(variance)

分类(classification)

分类:输入一个变量 输出其属于哪一类
应用:医疗诊断 手写字迹 信用等级 人脸辩识

eg:神奇宝贝属性分类
输入神奇宝贝各种数据 得出此神奇宝贝的属性

回归的方法得到分类的效果 即回归出不同数值对应不同类
问题:

  • 回归效果好的方程没有容易被特定点影响,导致分类效果差
  • 回归得出的数值与数值之间具有一定的关系(加减乘除 函数运算),而不同类别之间没有这种关系
    适用:
    回归对于二分的模型较为适用 将数值大于小于零分为两类
    损失方程定义为判断错误的次数
    问题:这种方程无法微分 可用感知机(perceptron)支持向量机( svm)等算法解决

概率方法 即用全概率公式求解出后验概率,数据属于其后验概率最大的一类

求解后验概率需要先验概率
通过现有的数据用极大概然的假设+合理的分布估计出先验概率
所有分布中用极大概然的观点求解出的分布即为对于训练集数据最优的函数
在此例子 神奇宝贝中拟合出现有数据概率最大的正态分布函数

这里将神奇宝贝分为两类,用两个正态分布函数分别得出先验概率
两个正态分布函数参数过多 过拟合
让两个正态分布函数共用一个方差
在七维数据中正确率显著提高

先验概率也不一定由正态分布得到
通过取自然对数的方式得到线性函数

混乱的结束:
我尽量理解每个人的想法,但在这过程中却逐渐差点迷失了自我。
大学四年从入学开始我就明白学习知识是主线,却因为别人的行为方式不断质疑。
质疑是必须的,但因为质疑而丧失行动能力就是一种反讽了。
于是我反思这种反思,否定之否定。
我是我,其他人是其他人,我需要改变也不需要改变。,
大学四年我需要不再自闭,但我还是要做我想做,我应该做,我必须做的事,学习知识。

躺平

我还是看了一小时视频的,只是没时间做笔记,我没有摸鱼~

做到了以往做不到的与人交流的方式

果然自己应该更果断,不拘泥于四叠半。合理摸鱼?
自信、勇气、行动。

李宏毅机器学习1.4-1.8

梯度下降法(gradient descent)详解

  • 前情提要:在第三步从函数集合中寻找最优函数,我们用损失函数(loss function)来寻找最优的函数,寻找的方法为梯度下降法求解出最优函数的参数
  • 举例:假设函数集为只有两个变量的线性函数,损失函数也由两个变量决定。
    首先随机选取初点,求出两个变量在当前损失函数的偏微分。
    初点减去偏微分的倍数(learning rate)的向量从而得到理论上损失函数值更小的点,
    反复迭代 直到满足迭代次数or偏微分为0的点。
  • 实际问题1:学习率(learning rate)的选值
    矛盾之处:较小所需较多的迭代次数才能达到最优值,消耗计算时间。较大跳跃性太强可能离最优值更远。
    分别可视化(visualize)不同学习率下迭代次数次数为x轴,当前参数loss值的函数为y轴。
    较小 下降速度缓慢;较大 loss值下降了部分后不变;非常大 loss值变大
    解决方法:
    1. 学习率随迭代次数的增加而减小
      假设损失值随迭代次数增加单调减小,开始由于损失值最大,学习率最大以加快下降。越往后越小以防跳出前往最优值的轨道。
    2. adagrad方法
      当前点与最优值的不同参数的距离不同,因此当前点的每个参数应有不同的学习率,
      每个参数的学习率是 随迭代次数递减的学习率 除以 所有学习率的平方的平均值的开方
      对于adagrad方法中下降向量的分子、分母均随偏微分增大而增大的理解
      • 直观理解 学习率表示的是当前相当前对于以前平均值的反差程度
      • 数学原理 在多个参数时,当前点一次微分越大的参数不一定离最优值参数越远,
        若二次微分较大,即曲线的导数的变化率较大,说明参数很小的变化,一次微分变化很大,不能直接使用变化剧烈的一次微分。
        因此学习率应该是当前一次微分除以当前二次微分,实际情况下用过去所有的平方值开根来近似二次微分。
    3. stochastic
      原本损失函数是所有sample的偏差值之和,然后计算其偏微分。
      现将损失函数定义为随机取一个sample的偏差值 计算出移动的梯度。
      一个sample的移动可能小且错误,但计算量小,最终可能能会又快有准。
    4. feature scaling
      training data中不同尺度的特征值,会导致每种特征对损失函数的影响不同。
      通常情况下,较大尺度的特征对损失函数的影响较大,而那些尺度较小的其他特征对损失函数的影响较小。
      这使较小尺度的特征值失去意义,对于梯度的影响较小。
      特征尺度归一化的原理,最终导致每种特征都是0均值,方差为1的特征。
      将参数的范围变成相同尺度,让等高线均匀,这样局部的梯度朝向就接近当前点与最优点的向量。
  • 实际问题2:
    若有局部最优,停留在局部最优。
    即使没有局部最优,同样会全微分值为0的驻点或偏微分值很小的点,且此点与最优点偏差很大。
  • 数学原理
    即在函数连续可微的条件下,寻找函数点领域内更小值的方法。
    找到此点的梯度,即领域足够小(无穷小)时,朝相反梯度方向移动函数值变得更小
    较大领域时可以考虑泰勒展开的二次式,但这些运算量较大

机器学习展望

  • 机器能说出我不知道
  • 机器能真的知道 而不是因为其他原因(比如真实数据都有水印)
  • 机器拥有惯性思维
  • 不同机器学习的任务互相影响促进
  • 能学习如何学习
  • 能用少量资料或间接的资料学习
  • 强化学习学习效率过低,远比人学习用的时间多才能人的水平
  • 缩小神经网络架构
  • 在现实中训练资料和测试资料偏差很大时仍能运作

打牌的胡适与看妹子的季羡林

李宏毅机器学习1.3

regression可以用于预测PM2.5、股市走向、自动驾驶、推荐系统

这里以预测神奇宝贝进化后的cp值为例

  1. 开始使用由线性函数构成function set
  2. 由input:原cp、output:进化后cp 构成training data
  3. 定义loss function
    input:a function from the function set
    output:how bad it is
  4. 使用gradient descent方法求解出traning data下loss函数值最小时function set中的best function
  5. 用test集和loss function检验,得出test data下best funtion的loss函数值

gradient decent方法

  • 适用条件:方程可微
  • 具体方法:先随机选取一点,再使用牛顿迭代法找到局部最优
  • 实际应用:一般可以构造出没有局部最优的loss function,能通过gradient decent方法求解出没有局部最优的loss function的最优解,
    但实际使用此方法时求解的过程都不容易用程序实现。

过拟合现象

  • 定义:越复杂的model能让training data下best的loss函数越来越低,但在testing data不一定,可能会更高,这种现象overfitting 过拟合。
  • 实例:我们不满线性函数model的结果,换了一个二次函数model,得到比线性函数更小的traning data和test data下best fuinction的loss函数值但四次、五次函数模型最优方程在test data下的loss函数值非常大。
    定义合适形式的复杂的函数模型,可以避免。比如收集更多数据后,发现有隐含因素(神奇宝贝的物种)。于是采用分类的线性函数模型,test data下的loss函数值很小。

regularization

  • 采用重新定义loss function的方式防止过拟合现象
  • 具体方式:在以往的loss加上参数总和的倍数以得到更加平滑的函数。
  • 原理:原先loss值较小,参数总和较小的函数变成新的best function
    相比于原最优函数,在相同自变量的改变值下因变量改变值更小。
    即,函数值不会因自变量的细微改变而剧烈改变。
    一定平滑的函数虽然在training data中拟合效果不是最好,但由于宝可梦cp值的改变函数为平滑的函数更符合实际状况,
    平滑的函数在test data中拟合的会效果更好。(注:因为常数项不影响函数的变化量,参数上不需要加上常数项)
  • 结果:test data下的loss值 在平滑程度递增的情况下先减小后增加

李宏毅机器学习1.1-1.2

一般的模式是hand crafted rules 设定(如同生物的本能)
weakness:

  • hard to consider all possibilities
  • 无法超越创造者
  • lots of human efforts(not suitable to small.machine)

Ai不是 if else 而是write the program for learning
learning a function,eg:

  • 将语音 映射到 文字
  • 将图片 映射到 具体内容

所有机器学习必经三步,具体各有问题

  1. define function set
  2. the way to find good functions
  3. pick the best function

如何让机器学到(supervised learning)

  1. 首先准备一个function set
  2. 准备training data to tell machine 好的function满足什么样的输入输出
  3. 机器从function set中找到好的function
  4. 用一个算法找到the best function
  5. 用测试集测试是否正确(包括是否能举一反三)

现有的机器学习方法,一般由拥有的数据类型选择学习的方法

  • supervised learning
    需要大量的训练数据,output通常需要人工标注出来(label)
  • semi supervised learning
    只有少量的labelled data 大量未标注数据
  • transfer learning
    只有少量 labelled data 还有大量无关数据
  • unsupervised learning
    只有输入 或 只有输出 机器自己做出一些神奇的事
  • reinforcement learning
    机器自己输出,告诉机器输出结果好坏
  • structured learning 输出一个体系(未知的新领域)

机器学习的任务

  • regression:the funtion of target funtion f is“scale”
    training data 具体数值
  • classification: 分类
    • binary 判断题
    • multi class 选择题

解决任务的模型

  • linear model
  • nolinear model
    • deep learning 能生成复杂的函数 需要找大量资料
    • svm. decision tree.knn

主要任务:机器挑选合适的model和loss function
结果:训练出的模型很可能不如人意

python从入门到实践 2.4-

age=23
message="Happy "+str(age)+" years old!"#将非字符串值表示为字符串
print(message)
import this#python方法论

this.py的代码有点意思

s = """Gur Mra bs Clguba, ol Gvz Crgref

Ornhgvshy vf orggre guna htyl.
Rkcyvpvg vf orggre guna vzcyvpvg.
Fvzcyr vf orggre guna pbzcyrk.
Pbzcyrk vf orggre guna pbzcyvpngrq.
Syng vf orggre guna arfgrq.
Fcnefr vf orggre guna qrafr.
Ernqnovyvgl pbhagf.
Fcrpvny pnfrf nera'g fcrpvny rabhtu gb oernx gur ehyrf.
Nygubhtu cenpgvpnyvgl orngf chevgl.
Reebef fubhyq arire cnff fvyragyl.
Hayrff rkcyvpvgyl fvyraprq.
Va gur snpr bs nzovthvgl, ershfr gur grzcgngvba gb thrff.
Gurer fubhyq or bar-- naq cersrenoyl bayl bar --boivbhf jnl gb qb vg.
Nygubhtu gung jnl znl abg or boivbhf ng svefg hayrff lbh'er Qhgpu.
Abj vf orggre guna arire.
Nygubhtu arire vf bsgra orggre guna *evtug* abj.
Vs gur vzcyrzragngvba vf uneq gb rkcynva, vg'f n onq vqrn.
Vs gur vzcyrzragngvba vf rnfl gb rkcynva, vg znl or n tbbq vqrn.
Anzrfcnprf ner bar ubaxvat terng vqrn -- yrg'f qb zber bs gubfr!"""

d = {}
for c in (65, 97):
    for i in range(26):
        d[chr(i+c)] = chr((i+13) % 26 + c)

print("".join([d.get(c, c) for c in s]))

发烧躺平

路易十六日记:“今日无事”。

python从入门到实践2.1-2.3

print("Hello Python world!")
message="Hello Python world!"
print(message)
message="Hello Crash Course world!"
#变量名只能包括字母、数字、下划线,不能以数字开头
name="ada Loveplace"
print(name.title())#首字母大写
print(name.upper())#全大写
print(name.lower())#全小写
fist_name='ada'
last_name='loveplace'
full_name=fist_name+" "+last_name#字符串直接加法
print(full_name)
print("Hello, "+full_name.title()+'!')
#制表符\t换行符\n
favorate_language='   Python   '
print(favorate_language.rstrip()+'a')#返回 无字符串尾部空格
print(favorate_language+'a')
favorate_language=favorate_language.rstrip()
print(favorate_language+'a')
print(favorate_language.lstrip()+'a')#返回 无字符串首部空格
favorate_language='   Python   '
print(favorate_language.strip()+'a')#返回 无字符串两端的空格

print(10**6)#两个乘号表示乘方运算
print(0.2+0.1)#浮点数精度有限

python从入门到实践2.1-2.3

print("Hello Python world!")
message="Hello Python world!"
print(message)
message="Hello Crash Course world!"
#变量名只能包括字母、数字、下划线,不能以数字开头
name="ada Loveplace"
print(name.title())#首字母大写
print(name.upper())#全大写
print(name.lower())#全小写
fist_name='ada'
last_name='loveplace'
full_name=fist_name+" "+last_name#字符串直接加法
print(full_name)
print("Hello, "+full_name.title()+'!')
#制表符\t换行符\n
favorate_language='   Python   '
print(favorate_language.rstrip()+'a')#返回 无字符串尾部空格
print(favorate_language+'a')
favorate_language=favorate_language.rstrip()
print(favorate_language+'a')
print(favorate_language.lstrip()+'a')#返回 无字符串首部空格
favorate_language='   Python   '
print(favorate_language.strip()+'a')#返回 无字符串两端的空格

print(10**6)#两个乘号表示乘方运算
print(0.2+0.1)#浮点数精度有限

posted on 2019-09-27 23:47  乱码luanma  阅读(275)  评论(0)    收藏  举报

导航