本文主要是介绍李烨课程学习提要,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
李烨课程学习提要
目录
李烨课程学习提要
00—前言
01---为什么要学原理和公式推导
02---学习机器学习原理,改变看待世界的方式
03---如何学习“机器学习”
04---为什么要学 Python 以及如何学Python
05---机器是如何学习的?
06---机器学习三要素之数据、模型、算法
07--模型的获取和改进
08---模型的质量和评判指标
09---最常用的优化算法——梯度下降法
10---线性回归——从模型函数到目标函数
11---线性回归——梯度下降法求解目标函数
12—朴素贝叶斯分类器——从贝叶斯定理到分类模型
13---朴素贝叶斯分类器:条件概率的参数估计
14---逻辑回归: 非线性逻辑函数的由来
15---逻辑回归: 用来做分类的回归模型
16---决策树——既能分类又能回归的模型
17---决策树——告诉你 Hello Kitty 是人是猫
18---SVM——线性可分 SVM 原理
19---SVM——直观理解拉格朗日乘子法
20---SVM——对偶学习算法
22---SVM——非线性 SVM 和核函数
23---SVR——一种“宽容”的回归模型
00—前言
这门课能帮助你快速进入人工智能领域,从事工程或者算法工作。
第一部分:绪论
第二部分:基本原理
第三部分:有监督学习 I
第四部分:有监督学习 II
第五部分:无监督学习
第六部分:从机器学习到深度学习
你将收获什么
1.AI 技术岗位求职知识储备
2.触类旁通各大模型与算法
3.极简版实例体验实际应用
4.配套数据+代码快速实操上手
数据是我们经过见过的万事万物,而算法则是我们的思辨能力。
01---为什么要学原理和公式推导
学习原理的必要性
功利层面:面试会考、老板会问、同事会质疑
实用层面:优化模型、针对问题实际问题定向建模
真正创造价值的,从来都是解决实际问题的人。
02---学习机器学习原理,改变看待世界的方式
破除迷信、追本溯源、精进看待世界的方法
学习机器学习原理和公式推导,并非只是做一些无聊的数字变换。很可能由此为我们打开一扇窗,让我们从新的角度就看待世界,并为日常决定的思考过程提供更加可量化方法。
03---如何学习“机器学习”
机器学习的核心——将事物转化为数值,将关系、变换转化为运算——以事实(数据)为依据,以规章(算法)为准绳,通过计算来掌握事物的客观规律(模型)。
反复学习,从记忆到掌握,由易到难,螺旋式推进。
数学需要多精深?
基础数学概念
两条路径反刍数学知识
制定数学知识速查手册
日常学习 Tips:关联、记录、分享
04---为什么要学 Python 以及如何学Python
根据数据平台 Kaggle 发布的2017年机器学习及数据科学调查报告,Python 是数据科学家和人工智能从业者使用最多的语言/工具。
语言简单易学,支持库丰富强大,这两大支柱从早期就奠定了 Python 的江湖地位。
了解下面这些概念:数据类型、变量、函数、参数、返回值、调用、递归……
学习流程控制:顺序、条件、循环。
搞清几种不同类型:array、list、dict、set 的用法。
在这个过程中,学习什么是静态类型,什么是动态类型,什么是强类型,什么是弱类型,这些不同设计的目的和应用场景分别是什么。
05---机器是如何学习的?
机器学习就是:让计算机程序(机器),不是通过人类直接指定的规则,而是通过自身运行,习得(学习)事物的规律,和/或事物间的关联。
计算机程序所能够处理,只有数值和运算。
要让一段程序了解客观世界变化万千的事物,则必须将这些事物数值化,将事物的变化
和不同事物之间的关联转化为运算。
机器(Machine)、学习(Learning)、数据(Data)、特征(Feature)、模型(Model)、算法(Algorithm)
通过标注数据进行学习的方法,就叫做有监督学习或直接叫监督学习(SupervisedLearning)
06---机器学习三要素之数据、模型、算法
源数据
特征工程做两件事:
1. 确定用哪些特征来表示数据;2. 确定用什么方式表达这些特征。
通过标注数据进行学习的方法,就叫做有监督学习或直接叫监督学习(SupervisedLearning)
模型是怎么得到的?
向量空间模型(Vector Space Model/VSM)和无标注数据、特征向量(Feature Vector)、有标注数据、模型
训练--根据已经被指定的 f(x) 的具体形式——模型类型,结合训练数据,计算出其中各个参数的具体取值的过程。
有监督学习的目标就是:让训练数据的所有 x 经过 f(x) 计算后,获得的 y’与它们原本对应的 y 的差别尽量小。
算法
目标函数:argmin J(theta)—— 最小化J(theta)
损失函数(Loss Function):对于一个训练数据,描述 y’与 y 之间的差别。
代价函数(Cost Function)对于所有训练数据,描述整体的损失。一般写作J(theta)
算法是机器学习和深度学习中最具技术含量的部分。
要得到高质量的模型,算法很重要,但往往(尤其是在应用经典模型时)更重要的是数据。
有监督学习需要标注数据。因此,在进入训练阶段前必须要经过一个步骤:人工标注。
标注的过程繁琐且工作量颇大,却无法避免。
机器学习三要素:数据、模型、算法
算法通过在数据上运算产生模型。
07--模型的获取和改进
训练集、验证集和测试集
每个集合都应当是独立的,和另外两个没有重叠。
大量的高质量训练数据,是提高模型质量的最有效手段。
超参数是需要模型训练者自己来设置和调整的
模型类型选择
08---模型的质量和评判指标
分类模型评判指标: 精准率(Precision)召回率(Recall)、 F1Score
指标对应的是模型和数据集
模型的偏差和过拟合(相对于过拟合)
09---最常用的优化算法——梯度下降法
学习的目标就是最小化目标函数的取值,而目标函数又是凸函数,那么学习的目标自然转化成了寻找某个凸函数的最小值。最常用的一种方法,叫做梯度下降法。
1. 随机取一个自变量的值 ;
2. 对应该自变量算出对应点的因变量值: ;
3. 计算 处目标函数 的导数;
4. 从 开始,沿着该处目标函数导数的方向,按一个指定的步长 ,向前“走一步”,
走到的位置对应自变量取值为 。换言之, 是 在 处的斜率;
5. 继续重复2-4,直至退出迭代(达到指定迭代次数,或 近似收敛到最优解)。
步长 是算法自己学习不出来的,它必须由外界指定。
这种算法不能学习,需要人为设定的参数,就叫做超参数。
梯度下降的难点:
如果目标函数有多个极小值点(多个向下的“弯儿”),那么如果开始位置不妥,很可能导致最终是走到了一个局部极小值就无法前进了。
这种情况下,可以尝试几个不同的起始点。甚至尝试一下大步长,说不定反而能够跨出局部最小值点所在的凸域。
10---线性回归——从模型函数到目标函数
从数据反推公式:用美国纽约若干程序员职位的年薪举例
综合利用训练数据,拟合线性回归函数:获得 a, b 两个参数取值
综合利用的原则是什么呢?就是我们要求的这个 a 和 b,在将训练样本的 x 逐个带入后,得出的预测年薪 y’= a + bx 与真实年薪 y 整体的差异最小。
具体的一个样本的 y 和 y’的差异用 来表示。
怎么衡量这个整体差距呢?我们用下面这个公式,我们把它叫做为 Cost Function,形式如(其中 m 为样本的个数):
在 y = a + bx 这个模型函数中,a 和 b 是常量参数,x 是自变量,而 y 是因变量。
但到了 J(a,b) 中, 和 是常量参数(也就是 m 个样本各自的 x 和 y 值),而 a 和 b
成了自变量,J(a,b) 是因变量。能够让因变量 J(a, b) 取值最小的自变量 a 和 b,就是最好的 a和 b。
我们要做的,就是找到最好的 a 和 b。
线性回归模型是:利用线性函数对一个或多个自变量 (x 或 ( ))和因变量(y)之间的关系进行拟合的模型。
线性函数的定义是:一阶(或更低阶)多项式,或零多项式。
特征是一维的,线性模型在二维空间构成一条直线;特征是二维的,线性模型在三维空间中构成一个平面;若特征是三维的,则最终模型在四维空间中构成一个体;以此类推……
用线性回归模型拟合非线性关系:比如把特征从一个“变成”两个。
11---线性回归——梯度下降法求解目标函数
代码:
import matplotlib.pyplot as plt
import numpy as np
from sklearn import datasets, linear_model
from sklearn.metrics import mean_squared_error, r2_score
experiences = np.array([0,1,2,3,4,5,6,7,8,9,10])
salaries = np.array([103100, 104900, 106800, 108700, 110400, 112300, 114200, 116100,
117800, 119700, 121600])
# 将特征数据集分为训练集和测试集,除了最后5个作为测试用例,其他都用于训练
X_train = experiences[:7]
X_train = X_train.reshape(-1,1)
X_test = experiences[7:]
X_test = X_test.reshape(-1,1)
# 把目标数据(特征对应的真实值)也分为训练集和测试集
y_train = salaries[:7]
y_test = salaries[7:]
# 创建线性回归模型
regr = linear_model.LinearRegression()
# 用训练集训练模型——看就这么简单,一行搞定训练过程
regr.fit(X_train, y_train)
# 用训练得出的模型进行预测
diabetes_y_pred = regr.predict(X_test)
# 将测试结果以图标的方式显示出来
plt.scatter(X_test, y_test, color='black')
plt.plot(X_test, diabetes_y_pred, color='blue', linewidth=3)
plt.xticks(())
plt.yticks(())
plt.show()
关于代码:
习惯用 import matplotlib.pyplot as plt语句来调用画图模块
import numpy as np http://www.cnblogs.com/yun1108/p/8989003.html
reshape(-1,1)https://blog.csdn.net/wld914674505/article/details/80460042
regr.fit(X_train, y_train) https://blog.csdn.net/jingyi130705008/article/details/78163955
scatter 散列图https://blog.csdn.net/pipisorry/article/details/40005163
操作过程:先再命令行键入python(或者IDLE),回车。
打开界面如下
点击File->New File
界面如下:
然后把代码复制过去。
点击Run ,在下拉列表选择Run Module F5
然后等待程序开始运行。
12—朴素贝叶斯分类器——从贝叶斯定理到分类模型
分类模型 VS 回归模型,最根本的不同:前者是预测一个标签(类型、类别);后者则是预测一个量。
换一个角度来看,分类模型输出的预测值是离散值;而回归模型输出的预测值则是连续值
13---朴素贝叶斯分类器:条件概率的参数估计
参数估计(Parameter Estimation)
极大似然估计(Maximum Likelihood Estimation, MLE)
极大似然估计,就是去寻找让似然函数 的取值达到最大的参数值的估计方法。
最大化一个似然函数同最大化它的自然对数是等价的
用代码实现朴素贝叶斯模型
代码:
import pandas as pd
import numpy as np
import time
from sklearn.model_selection import train_test_split
from sklearn.naive_bayes import GaussianNB
# Importing dataset.
# Please refer to the 【Data】 part after the code for the data file.
data = pd.read_csv("career_data.csv")
# Convert categorical variable to numeric
data["985_cleaned"]=np.where(data["985"]=="Yes",1,0)
data["education_cleaned"]=np.where(data["education"]=="bachlor",1,
np.where(data["education"]=="master",2,
np.where(data["education"
]=="phd",3,4)
)
)
data["skill_cleaned"]=np.where(data["skill"]=="c++",1,
np.where(data["skill"]=="java",2,3
)
)
data["enrolled_cleaned"]=np.where(data["enrolled"]=="Yes",1,0)
# Split dataset in training and test datasets
X_train, X_test = train_test_split(data, test_size=0.1,
random_state=int(time.time()))
# Instantiate the classifier
gnb = GaussianNB()
used_features =[
"985_cleaned",
"education_cleaned",
"skill_cleaned"
]
# Train classifier
gnb.fit(
X_train[used_features].values,
X_train["enrolled_cleaned"]
)
y_pred = gnb.predict(X_test[used_features])
# Print results
print("Number of mislabeled points out of a total {} points : {},performance {:05.2f}%"
.format(
X_test.shape[0],
(X_test["enrolled_cleaned"] != y_pred).sum(),
100*(1-(X_test["enrolled_cleaned"] != y_pred).sum()/X_test.shape[0])
))
下列数据直接存储为 career_data.csv 文件(可以用Excel打开):
no 985 education skill enrolled
1 Yes bachlor C++ No
2 Yes bachlor Java Yes
3 No master Java Yes
4 No master C++ No
5 Yes bachlor Java Yes
6 No master C++ No
7 Yes master Java Yes
8 Yes phd C++ Yes
9 No phd Java Yes
10 No bachlor Java No
我的存储方式:先打开一个空白文本文档,把数据复制过去,把文本文档的名字和后缀改为career_data.csv
注意,文档的位置要和py程序的位置在一个目录即统一路径,不然调用不了。
运行脚本,即运行程序,结果应该是:
结果为
Number of mislabeled points out of a total 1 points : 0,performance 100.00%
一致。
import time 导入时间模块http://qinxuye.me/article/details-about-time-module-in-python/
14---逻辑回归: 非线性逻辑函数的由来
逻辑函数(LR-Logistic Regression)又称Sigmod函数(S函数),因为表现像S形曲线。
通用形式是:
一元自变量
逻辑函数表现的是存量随时间增长渐增的关系。而增长率和时间的关系式存量(逻辑函数)的微分函数。
学习理论相对于学习经验具备更长久也更深入的有效性。
15---逻辑回归: 用来做分类的回归模型
LR 典型的应用是二分类问题上
模型函数在y=0.5附近非常敏感。大于0.5,真性,阳性,小于0.5,假性,阴性
用线性回归实现代码
代码:
from sklearn.linear_model import LogisticRegression
from sklearn.linear_model import LinearRegression
import pandas as pd
# Importing dataset
data = pd.read_csv('quiz.csv', delimiter=',')
used_features = [ "Last Score", "Hours Spent"]
X = data[used_features].values
scores = data["Score"].values
X_train = X[:11]
X_test = X[11:]
# Linear Regression - Regression
y_train = scores[:11]
y_test = scores[11:]
regr = LinearRegression()
regr.fit(X_train, y_train)
y_predict = regr.predict(X_test)
print(y_predict)
结果:
[55.33375602 54.29040467 90.76185124]
用逻辑回归实现代码
代码:
from sklearn.linear_model import LogisticRegression
from sklearn.linear_model import LinearRegression
import pandas as pd
# Importing dataset
data = pd.read_csv('quiz.csv', delimiter=',')
used_features = [ "Last Score", "Hours Spent"]
X = data[used_features].values
scores = data["Score"].values
X_train = X[:11]
X_test = X[11:]
# Logistic Regression – Binary Classification
passed = []
for i in range(len(scores)):
if(scores[i] >= 60):
passed.append(1)
else:
passed.append(0)
y_train = passed[:11]
y_test = passed[11:]
classifier = LogisticRegression(C=1e5)
classifier.fit(X_train, y_train)
y_predict = classifier.predict(X_test)
print(y_predict)
结果:
[1 0 1]
16---决策树——既能分类又能回归的模型
一棵决策树(Decision Tree)是一个树结构(可以是二叉树或非二叉树),每个非叶节点对应一个特征,该节点的每个分支代表这个特征的一个取值,而每个叶节点存放一个类别或一个回归函数。
决策节点、特征、分裂特征
分裂特征的目标,是让各个分裂子集尽可能地“纯”。
使得各个分裂子集“纯”:
ID3 算法(Iterative Dichotomiser 3):以信息增益为度量,选择分裂后信息增益最大的特征进行分裂。
信息熵、信息增益、
C4.5 算法
信息增益率(Gain Ratio)、分裂信息(Split Information)、
CART 算法Classification and Regression Tree 分类和回归树
Gini 系数(Gini Coefficient)、劳伦茨曲线、Gini 指数(Gini Index)
17---决策树——告诉你 Hello Kitty 是人是猫
后剪枝优化决策树、先剪枝(局部剪枝)、后剪枝(全局剪枝)
代码:
from sklearn import tree
from sklearn.model_selection import train_test_split
import numpy as np
#9个女孩和8只猫的数据,对应7个feature,yes取值为1,no为0
features = np.array([
[1, 1, 0, 0, 1, 0, 1],
[1, 1, 1, 0, 0, 0, 1],
[0, 1, 0, 0, 0, 0, 1],
[1, 1, 0, 0, 1, 0, 1],
[0, 1, 0, 0, 1, 0, 0],
[0, 1, 0, 0, 1, 0, 1],
[1, 1, 0, 0, 1, 0, 0],
[0, 1, 0, 0, 1, 0, 1],
[0, 1, 0, 1, 1, 1, 1],
[1, 0, 1, 1, 1, 1, 0],
[0, 0, 0, 1, 1, 1, 0],
[1, 0, 1, 1, 1, 1, 0],
[0, 0, 0, 1, 1, 1, 0],
[1, 0, 0, 1, 1, 1, 0],
[0, 0, 1, 0, 1, 1, 0],
[1, 1, 1, 1, 1, 1, 0],
[1, 0, 1, 1, 1, 1, 0]
])
#1 表示是女孩,0表示是猫
labels = np.array([
[1],
[1],
[1],
[1],
[1],
[1],
[1],
[1],
[1],
[0],
[0],
[0],
[0],
[0],
[0],
[0],
[0],
])
# 从数据集中取20%作为测试集,其他作为训练集
X_train, X_test, y_train, y_test = train_test_split(
features,
labels,
test_size=0.2,
random_state=0,
)
# 训练分类树模型
clf = tree.DecisionTreeClassifier()
clf.fit(X=X_train, y=y_train)
# 测试
print(clf.predict(X_test))
# 对比测试结果和预期结果
print(clf.score(X=X_test, y=y_test))
# 预测HelloKitty
HelloKitty = np.array([[1,1,1,1,1,1,1]])
print(clf.predict(HelloKitty))
结果:
[1 1 0 0]
0.75
[0]
18---SVM——线性可分 SVM 原理
线性可分、超平面(Hyperplane)、线性分类模型、线性分类器
以最大间隔把两类样本分开的超平面,是最佳超平面
支持向量机(Support Vector Machine,SVM)
求最大分割超平面问题其实是一个约束条件下的最优化问题
线性可分 SVM 的目标函数:一个带约束条件的求极值问题
19---SVM——直观理解拉格朗日乘子法
拉格朗日乘子法,一种多元函数在变量受到条件约束时,求极值的方法。可以用来解决 SVM 的目标函数最优化。
函数的梯度与它的等高线垂直。
拉格朗日乘子
拉格朗日函数也可以通过求导变化成约束条件本身。
原本有约束的优化问题,就可以转化为对拉格朗日函数的无约束优化问题了。
KKT 约束条件
20---SVM——对偶学习算法
线性可分 SVM 的目标函数可以通过求解其对偶问题来求解
SMO(sequential minimal optimization)算法
22---SVM——非线性 SVM 和核函数
对于在有限维度向量空间中线性不可分的样本,我们将其映射到更高维度的向量空间里,再通过间隔最大化的方式,学习得到支持向量机,就是非线性 SVM.
这个更高维度的新空间叫做特征空间.
非线性 SVM = 核技巧 + 线性 SVM
核矩阵
多项式核(Polynomial Kernel)
RBF 核(Radial Basis Function Kernel)高斯核 (Gaussian Kernel)Sigmoid 核(Sigmoid Kernel)数据归一化(Data Normalization)
23---SVR——一种“宽容”的回归模型
线性回归:在向量空间里用线性函数去拟合样本。
严格的线性回归,所有样本实际位置到该线性函数的综合距离为损失,通过最小化损失来求取线性函数的参数
宽容的支持向量回归(SVR)支持向量回归(Support Vector Regression,SVR)
SVR 和线性回归,却是两个不同的回归模型,计算损失的原则不同,目标函数和最优化算法也不同
SVR 在线性函数两侧制造了一个“间隔带”,对于所有落入到间隔带内的样本,都不计算损失;只有间隔带之外的,才计入损失函数。之后再通过最小化间隔带的宽度与总损失来最优化模型。SVR 巴不得所有的样本点都落在“隔离带”里面,而 SVM 则恰恰希望所有的样本点都在“隔离带”之外!
SVR 的两个松弛变量
SVR 的主问题和对偶问题
SVR 的核技巧
这篇关于李烨课程学习提要的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!