目录
- 前言
- 一、机器学习介绍与定义
- 1.1 机器学习定义
- 1.2 机器学习的发展历史
- 二、机器学习分类
- 2.1 监督学习
- 2.2 无监督学习(UnSupervised Learning)
- 2.3 半监督学习
- 2.4 强化学习
- 三、机器学习的应用场合
- 四、 机器学习未来发展与挑战
- 4.1 未来发展的方向
- 4.2 数据质量问题
- 4.3 人工智能与安全问题
- 五、scikit-learn简介
- 5.1 scikit-learn简介
- 5.1.1 scikit-learn官网首页如下图标
- 5.2 scikit-learn的特点如下
- 5.3 scikit-learn官网
- 5.4 scikit-learn安装与使用
- 六、scikit-learn的主要功能
- 6.1 Scikit-learn包含的内容
- 6.1.1 数据预处理:
- 6.1.2 算法:
- 6.2 scikit-learn的优点
- 6.3 缺点
- 七、KNN(K近邻算法)
- 7.1 KNN算法理论
- 7.1.1 KNN算法概念
- 7.1.2 KNN算法介绍
- 7.2 KNN算法三要素
- 7.2.1 K值选择:
- 7.2.2距离选择
- 7.2.3分类规则选择
- 7.4 KNN算法步骤:
- 7.5 KNN算法思想
- 7.5.1 欧式距离(Euclidean Distance):
- 7.5.2 数学方法实现KNN算法
- 总结
前言
机器学习基础
1.机器学习算法通常较为简单,易于理解和实现。
2.KNN(K-近邻算法)线性回归 等这些算法不需要太多的数学基础。
3.机器学习主流框架的学习,如pytorch tensorflow paddlepaddle。
机器学习高级
1.高级机器学习算法通常更加复杂,涉及更多的数学和统计理论。
2.概率论知识的学习,高等数学知识的学习。
3.k均值聚类 、支持向量机等机器学习,学习算法的精讲
机器学习例子 1
如何定位对方火炮的位置。
机器学习例子2
如何快速识别出是不是你家的猫?
总结:
机器学习还有很多应用,掌握机器学习算法和技术是非常重要的。
那下面就开始我们机器学习的学习之旅。
一、机器学习介绍与定义
1.1 机器学习定义
机器学习(Machine Learning)本质上就是让计算机自己在数据中学习规律,并根据所得到的规律对未来数据进行预测。
机器学习算法:包括线性回归、逻辑回归、聚类算法(K均值聚类)、决策树、朴素贝叶斯、深度学习(卷积神经网络CNN、循环神经网络RNN、长短时记忆网络LSTM)等算法。
1.2 机器学习的发展历史
| | | |
20世纪50年代,人工智能的概念被提出,旨在通过计算机模拟人类的智能行为。 | 20世纪80年代,神经网络(BP)的研究开始兴起,旨在通过模拟人脑神经元网络来处理信息。 | 随着机器学习的发展,支持向量机、朴素贝叶斯等算法相继出现,将机器学习从知识驱动转变为数据驱动的思路。 | 2012年,随着算力提升和海量训练样本的支持,深度学习成为机器学习研究热点,并带动了产业界的广泛应用。 |
二、机器学习分类
机器学习经过几十年的发展,衍生出了很多种分类方法,这里按学习模式的不同,可分为监督学习、半监督学习、无监督学习和强化学习。
2.1 监督学习
监督学习是从已有的训练数据集(标记数据)中学习模型,然后对新的数据进行预测的一种机器学习方法。
线性回归:通过找到最佳拟合线来预测因变量的值。
逻辑回归:用于二元分类的监督学习算法
决策树:通过构建树状结构来对新的数据进行分类或回归
分类问题:垃圾邮件识别、人脸识别等。
回归问题:股票价格预测、预测天气等。
eg:理解监督学习
2.2 无监督学习(UnSupervised Learning)
无监督学习通过分析输入数据的特点和结构,自动地找出数据中的模式和规律,而不需要人工标注和干预。
K-means:用于聚类分析。
DBSCAN:基于密度的算法,发现任意形状的聚类。
层次聚类:基于距离的算法,将数据点按照距离远近进行聚类。
聚类:将数据集划分为多个组。
降维:将高维数据降维,更容易理解和可视化数据。
关联规则学习:超市购物篮分析中,发现哪些商品经常一起被购买。
2.3 半监督学习
半监督学习利用标记和未标记的数据来进行训练和预测。
标签传播:通过迭代地传播标签,使得每个样本的标签都尽可能地一致。
学习算法:通过学习算法可以训练出更好的模型,提高分类准确率。
分类问题:垃圾邮件识别、人脸识别等。
聚类问题:市场细分、社交网络分析等。
eg:标签传播效果图:
2.4 强化学习
强化学习通过试错的方式让机器学习如何做出最优决策
Q-Learning:构建Q表来对环境进行建模实现决策。
Deep Q Network (DQN):结合深度学习通过训练神经网络来逼近Q函数,实现更高效的学习。
Policy Gradient Methods:优化策略寻找最优解。
游戏AI:AlphaGo,通过自我对弈提升技能。
机器人控制:根据环境反馈进行自我调整,实现更精准的控制。
eg:
三、机器学习的应用场合
机器学习的应用场景非常广泛,几乎涵盖了各个行业和领域。以下是一些常见的机器学习应用场景的示例:
| 01机器翻译 | 02语音识别 | 03文本分类 |
| 04视觉垂直领域 | 05预测与推荐系统 | 06决策支持与智能分析 |
四、 机器学习未来发展与挑战
4.1 未来发展的方向
| 垂直性(落地化) 很多传统的垂直领域都需要有机器学习的加入,例如医疗、市场等,这些垂直领域可以是专门完成具体的某一项任务的模型也可以是一个什么都会的模型。 |
| 多样性 机器学习衍生出来的算法、模型多种多样它们都各有所长,也有所短,受到现场部署环境、硬件条件、数据等影响,多样性的发展可以适配不同的领域。 |
4.2 数据质量问题
随着机器学习应用的普及,数据量不足的问题愈发突出,影响模型的训练效果和预测精度。
不同来源的数据可能存在质量差异,导致模型在某些方面的性能受到影响。
在利用数据进行机器学习时,如何保护个人隐私和数据安全成为亟待解决的问题。
4.3 人工智能与安全问题
随着人工智能技术的不断发展,我们面临着越来越多的伦理挑战,例如隐私、安全和公平等问题。
需要思考如何平衡人工智能技术的发展和伦理、安全问题,以确保人工智能技术能够为人类带来更多的利益。
随着机器学习模型变得越来越复杂,算法的可解释性变得越来越困难。
五、scikit-learn简介
5.1 scikit-learn简介
5.1.1 scikit-learn官网首页如下图标
scikit-learn工具 - 开源,可商业使用
5.2 scikit-learn的特点如下
scikit-learn提供了简单高效的算法和工具,方便用户快速进行数据分析和机器学习。
scikit-learn采用模块化设计,使得用户可以根据需要自由组合不同的算法和工具。
scikit-learn提供了丰富多样的机器学习算法,包括分类、回归、聚类、降维等,满足用户不同需求。
5.3 scikit-learn官网
Scikit-learn官网:scikit-learn: machine learning in Python — scikit-learn 1.6.1 documentation
Scikit-learn中文文档:sklearn
5.4 scikit-learn安装与使用
01安装scikit-learn
可以使用pip或conda等包管理工具进行安装
pip install -U scikit-learn -i https://pypi.tuna.tsinghua.edu.cn/simple/
02基本使用方法
导入必要的模块和函数
eg:from sklearn.linear_model import LinearRegression
新建一个.py文件
输入下面命令 进行测试一下sklearn是否安装成功
from sklearn.linear_model import LinearRegression
六、scikit-learn的主要功能
6.1 Scikit-learn包含的内容
Scikit-learn包含的内容大体可以分为以下数据预处理和算法
6.1.1 数据预处理:
scikit-learn提供了数据清洗的功能,包括缺失值处理和异常值检测等。
scikit-learn提供了特征选择的功能,可以帮助用户选择最重要的特征,提高模型的准确率。
scikit-learn提供了特征转换的功能,可以将原始特征转换为更符合模型需求的特征。
6.1.2 算法:
各种回归算法、支持向量机、决策树、随机森林等
K-means、谱聚类、DBSCAN等
PCA(主成分分析)、LDA(线性判别分析)等
6.2 scikit-learn的优点
| 01功能强大 scikit-learn提供了丰富的机器学习算法和工具,可以满足各种不同的需求。 | 02易于使用 scikit-learn的API设计简洁明了,易于理解和使用,降低了机器学习的门槛。 | 03社区支持 scikit-learn拥有庞大的用户和开发者社区,为使用者提供了丰富的资源和支持。 |
6.3 缺点
| 01不易理解 对于初学者来说,scikit-learn的文档和API可能难以理解,特别是英文官网,入手难度高,中文网站API往往滞后。 |
七、KNN(K近邻算法)
7.1 KNN算法理论
7.1.1 KNN算法概念
K最近邻(K-Nearest Neighbor,KNN)分类算法是数据挖掘分类技术中最简单的方法之一,是著名的模式识别统计学方法,在机器学习分类算法中占有相当大的地位。它是一个理论上比较成熟的方法。既是最简单的机器学习算法之一,也是基于实例的学习方法中最基本的,又是最好的文本分类算法之一。
7.1.2 KNN算法介绍
定义:KNN(K-Nearest Neighbor) k个最近的邻居,即每个样本都可以用它最接近的k个邻居来代表,KNN算法属于监督学习方式的分类算法,通过测量不同数据点之间的距离进行分类或回归分析。
原理-“近朱者赤”基于实例的学习(instance-based learning),属于懒惰学习(Lazy learning),即KNN没有显示的学习过程,也就是说没有训练阶段(仅仅是把样本保存起来,训练时间开销为零)它是通过测量不同数据点的之间的距离进行分类或者回归。
特点: KNN算法简单易懂,易于实现;
无需训练阶段,直接进行分类或者回归;
适用于多分类问题;
对数据集的大小和维度不敏感
7.2 KNN算法三要素
KNN算法有三要素:1.K值选择;2.距离选择;3.分类规则选择。
7.2.1 K值选择:
算法中的K在KNN中,称为超参数(Hyper parameter)(超参数就是需要你手动设定的参数),需要人为选择不同的K值,这个参数是需要人为选择的。
K值选择存在的问题:
K值过小:
优点:复杂的数据集,K值较小可能会提供更详细的决策边界,因为模型更加灵活。
缺点:容易受到局部结构的影响,模型受噪声和异常值的影响更大。
选择较小的K值,就相当于用较小的领域中的训练实例进行预测,“学习”近似误差会减小,只有与输入实例较近或相似的训练实例才会对预测结果起作用,与此同时带来的问题是“学习”的估计误差会增大,换句话说,K值的减小就意味着整体模型变得复杂,容易发生过拟合;
k值过大:
优点:考虑了更多的全局信息,对于平滑的数据集,较大的K值可以提供更稳定的决策边界。
缺点:对于复杂的数据集,较大的K值可能会导致模型过于简单,无法准确捕获数据的局部特征。
选择较大的K值,就相当于用较大领域中的训练实例进行预测,其优点是可以减少学习的估计误差,但缺点是学习的近似误差会增大。这时候,与输入实例较远(不相似的)训练实例也会对预测器作用,使预测发生错误,且K值的增大就意味着整体的模型变得简单。
极端情况,K=N(N为训练样本个数),则完全不足取,因为此时无论输入实例是什么,都只是简单的预测它属于在训练实例中最多的类,模型过于简单,忽略了训练实例
如何选择最优的K值?
在实际应用中,K值一般取一个比较适中的数值,例如采用交叉验证法(简单来说,就是把训练数据在分成两组:训练集和验证集)来选择最优的K值。
7.2.2距离选择
k近邻法(K-Nearest Neighbor,KNN):计算新的点(测试点)到每一个已知点(标签点)的距离,并比对距离,使用不同的距离公式会得到不同的分类效果。后面会介绍一下常用的距离计算方法。
7.2.3分类规则选择
分类问题:对新的实例,根据与之相邻的k个训练实例的类别,通过多数表决法或者加权多数表决法等方式进行预测
回归问题:对新的实例,根据与之相邻的K个训练实例的标签,通过均值计算进行预测。
7.4 KNN算法步骤:
输入:训练数据集T={(x1,y1),(x2,y2)...(xn,yn)},x1为实例的特征向量,yi={c1,c2,c3...ck}为实例类别。
输出:测试实例x所属的类别y。
步骤:
(1)选择参数K
(2)计算未知实例与所有已知实例的距离(可选择多种计算距离的方式)
(3)选择最近K个已知实例
(4)根据少数服从多数的投票法则(Majority-voting),让未知实例归类为K个最近邻样本中最多数的类别。
7.5 KNN算法思想
K近邻算法,假定给定一个训练数据集,其中实例标签已定,当输入新的实例时,可以根据其最近的k个训练实例的标签,预测新实例对应的标注信息(标签属于哪一类)
图中绿色的点就是我们要预测的那个点,假设K=3。那么KNN算法就会找到与它距离最近的三个点(这里用圆圈把它圈起来了),看看哪种类别多一些,比如这个例子中是蓝色三角形多一些,新来的绿色点就归类到蓝三角了。
7.5.1 欧式距离(Euclidean Distance):
欧氏距离是最容易直观理解的两点之间的距离度量方法,也称为直线距离。
在二维空间中,欧式距离计算两点之间的直线距离。
公式 2维,3维,n维计算公式:
缺点:在使用此距离度量之前,需要对数据进行标准化(不是绝对的)。随着数据维度的增加,欧式距离的用处也就越小。
import numpy as np# 定义两个点的坐标列表
x_point = [7.3, 4.5]
y_point = [6, 4.2]def eucalidian_distance(x_point, y_point):"""计算两点之间的欧几里得距离(使用循环实现)Args:x_point: 第一个点的坐标列表y_point: 第二个点的坐标列表Returns:float: 两点之间的欧几里得距离"""#zip压缩打包sum = 0for a, b in zip(x_point, y_point):sum = sum + (a - b) ** 2return np.sqrt(sum)ed = eucalidian_distance(x_point, y_point)
print(ed)def eucalidian_distance_1(x_point, y_point):"""计算两点之间的欧几里得距离(使用numpy向量化实现)Args:x_point: 第一个点的坐标列表y_point: 第二个点的坐标列表Returns:float: 两点之间的欧几里得距离"""x_1 = np.array(x_point)y_1 = np.array(y_point)return np.sqrt(np.sum((x_1 - y_1) ** 2))ed = eucalidian_distance_1(x_point, y_point)
print(ed)
7.5.2 数学方法实现KNN算法
#导入画图包
import matplotlib.pyplot as plt
import numpy as np#数据点集合
point1 = np.array([[7.7, 6.1], [3.1, 5.9], [8.6, 8.8], [9.5, 7.3], [3.9, 7.4], [5.0, 5.3], [1.0, 7.3]]) # 第一类数据点
point2 = np.array([[0.2, 2.2], [4.5, 4.1], [0.5, 1.1], [2.7, 3.0], [4.7, 0.2], [2.9, 3.3], [7.3, 7.9]]) # 第二类数据点
point3 = np.array([[9.2, 0.7], [9.2, 2.1], [7.3, 4.5], [8.9, 2.9], [9.5, 3.7], [7.7, 3.7], [9.4, 2.4]]) # 第三类数据点
#整合数据
point = np.concatenate((point1, point2, point3), axis=0) # 将所有数据点合并为一个数组
#添加标签
label = np.array([0] * len(point1) + [1] * len(point2) + [2] * len(point3)) # 为每个数据点添加对应的类别标签
#设置要预测的数据点
point_YuCe = np.array([3.35, 2.46]) # 待预测点的坐标#计算l2距离(欧氏距离)
def l2(x, y):x_1 = np.array(x)y_1 = np.array(y)return np.sqrt(np.sum((x_1 - y_1) ** 2))#初始化k值
k = 5 # KNN算法中的k值,表示选取最近邻的数量#取最近的k个点(计算所有距离,取距离最小的5个k个点)
#存储所有的距离
len_all = [] # 用于存储预测点与所有数据点之间的距离
#计算预测点与所有数据点之间的距离
for i in point:len_all.append(l2(point_YuCe, i)) # 计算预测点与所有数据点之间的距离
point_k_s = np.argsort(np.array(len_all)) # 对距离进行排序并获取索引#获取最近的k个点
#获取数据标签
label_k = [label[i] for i in point_k_s[:k]] # 获取最近的k个点的标签
point_k = [point[i] for i in point_k_s[:k]] # 获取最近的k个点
print(label_k)
#分组计数
counts = np.bincount(label_k)
#获取最多的类别
label_max = np.argmax(counts) # 获取最多的类别
print(label_max)#画图
#获得五条线的距离
len_5 = [len_all[i] for i in point_k_s[:5]]
#给图画字
for i in range(k):plt.plot([point_YuCe[0], point_k[i][0]], [point_YuCe[1], point_k[i][1]], 'r-') # 画线plt.annotate("%s" % round(len_5[i]), xy=((point_YuCe[0] + point_k[i][0]) / 2, (point_YuCe[1] + point_k[i][1]) / 2)) # 画字plt.xlabel('x axis label')
plt.ylabel('y axis label')
plt.scatter(point1[:, 0], point1[:, 1], marker='*') # 画点
plt.scatter(point2[:, 0], point2[:, 1], marker='^') # 画点
plt.scatter(point3[:, 0], point3[:, 1], marker='s') # 画点
plt.scatter(point_YuCe[0], point_YuCe[1], marker='o')
plt.show()
总结
本文系统性地介绍了机器学习的定义、发展历史及分类方法,包括监督学习、无监督学习、半监督学习和强化学习,并深入探讨了KNN算法的理论基础、三要素(K值选择、距离度量、分类规则)及实现步骤。通过欧式距离的数学推导和Python代码示例,展示了KNN算法的实际应用,如分类问题中的多数表决机制。文章还列举了机器学习的广泛应用场景(如机器翻译、语音识别、推荐系统)和未来挑战(数据质量、算法可解释性、伦理安全),最后介绍了Scikit-learn工具库的功能与使用方法,为读者提供了从理论到实践的完整学习路径。