概述:机器学习能让我们从数据中获得启发,换句话说,我们会利用计算机来彰显数据背后的真实含义,这是机器学习的真实含义。简单的说,机器学习就是把无序的数据转换为有用的信息。
(1)分类:主要任务就是将实例数据划分到合适的分类中。
(2)回归:主要用于预测数值型数据,比如常见的数据拟合曲线:通过给定数据点的最优拟合曲线。
分类和回归都属于监督学习
(1)聚类:在无监督学习中,将数据集合分成由类似的对象组成的多个类的过程被称为聚类;
(2)密度估计:将寻找描述数据统计值的过程称为密度估计。
上表中处理一个问题的算法有四种,如何从上表中列出的算法中选择实际可用的算法,必须要考虑下面两个问题:
**1)使用机器学习算法的目的,想要算法完成何种任务 **
如果想要预测目标变量的值,可以选择监督学习算法,否则选择无监督学习算法。确定监督学习算法之后,需要进一步确定目标变量类型:
a. 如果目标变量是离散型,如是/否、1/2/3或者红/黑,则可以选择分类器算法
b. 如果目标变量是连续型的数值,如0.01~1000、 -999-999,则需要选择回归算法
如果不想预测目标变量的值,则可以选择无监督学习算法,进一步分许是否需要将数据划分为离散的组:
a. 需要将数据划分为离散的组,则使用聚类算法
b. 如果还需要估计数据于每个分组的相似程度,则使用密度估计算法
在大多数情况下,以上给出的方法能帮助研究员选择恰当的机器学习算法,但这也并非一成不变。
2)需要分析或收集的数据是什么
我们还要充分了解数据,对实际数据了解的越充分,越容易创建符合实际需求的应用程序。
主要了解数据的以下特性:特征值是离散变量还是连续性变量,特征值中是否存在缺失的值,何种原因造成缺失值,是否存在异常值,某个特征发生的频率如何等等
我们只能在一定程度上缩小算法的选择范围,一般不存在最好的算法或者可以给出最好结构的算法,同时还要尝试不同算法的执行效果。
(1)收集数据
(2)准备输入数据(转换数据格式。。。)
(3)分析输入数据(如信任数据来源,可以跳过此步)
(4)训练算法(我们将前两步得到的格式化数据输入到算法,从中抽取知识或信息。如果使用无监督学习,由于不存在目标变量值,故而也不需要训练算法)
(5)测试算法(将实际使用第4步机器学习的到的知识信息)
注:为了评估算法,必须测试算法工作的效果。对于监督学习,必须已知用于评估算法的目标变量值;对于无监督学习,也必须用其他的评测手段来检验算法的成功率。
(6)使用算法(将机器学习算法转换为应用程序)
第4步和第5步是机器算法的核心
简单来说,K-近邻算法采用测量不同特征值之间的距离方法进行分类。
**工作原理:**存在一个样本数据集合,也称为训练样本集,并且样本集中每个数据都有对应的标签,即我们知道每一数据与所属分类的对应关系。输入没有标签的数据后, 将新数据的每个特征与样本集中数据对应的特征进行比较,然后算法提取样本集中特征最相似数据(最近邻)的分类标签。一般来说,我们只选择样本数据集中前K个最相似的数据,这就是K-近邻算法中K的出处,通常K不大于20的整数。最后,选择K个最相似数据中出现次数最多的分类,作为新数据的分类。
优点:精度高、对异常值不敏感
缺点:计算复杂度高、空间复杂度高
适用数据范围:数值型和标称型
dataSet1 = array([[0, 10], [1, 8], [10, 1], [7, 4]])
labels = ['言情', '言情', '玄幻', '玄幻']
def knn(inX, dataSet, labels, k): # inX是用于分类的输入向量,dataSet输入的训练样本集
dataSetSize = dataSet.shape[0] # 计算样本数据的行数 --->4
# print(dataSetSize)
# 计算样本数据和X数据的差值
# a = tile([6, 2], (4, 1))
# >> > a
# array([[6, 2],
# [6, 2],
# [6, 2],
# [6, 2]])
# >> > dataSet1 = array([[0, 10], [1, 8], [10, 1], [7, 4]])
# >> > a = tile([6, 2], (4, 1)) - dataSet1
# >> > a
# array([[6, -8],
# [5, -6],
# [-4, 1],
# [-1, -2]])
diff = tile(inX, (dataSetSize, 1)) - dataSet # diff = tile([6,2],(4,1)) 将[6,2]调整为4行1列
# print(diff)
sqrDiff = diff ** 2 # 差值的平方
# >> > b = a ** 2
# >> > b
# array([[36, 64],
# [25, 36],
# [16, 1],
# [1, 4]], dtype=int32)
sqrDiffSum = sqrDiff.sum(axis=1) # 计算差值的平方和
# >> > c = b.sum(axis=1)
# >> > c
# array([100, 61, 17, 5], dtype=int32)
distances = sqrDiffSum ** 0.5 # 计算距离,两点之间计算距离
# >> > d = c ** 0.5
# >> > d
# array([10., 7.81024968, 4.12310563, 2.23606798])
sortDistance = distances.argsort() # 从小到大排序
# >> > e = d.argsort()
# >> > e
# array([3, 2, 1, 0], dtype=int64)
count = {} # {'玄幻': 2, '言情': 1}
for i in range(k):
vote = labels[sortDistance[i]]
count[vote] = count.get(vote, 0) + 1
# 对所得距离从低到高进行排序
sortCount = sorted(count.items(), key=operator.itemgetter(1), reverse=True)
# 对类别出现的频数从高到低进行排序
return sortCount[0][0] # 返回出现频数最高的类别
3.测试KNN
inX = [6,2]
X = knn(inX,dataSet1,labels,3)
print(X)
决策树的思想跟这个游戏思想类似,参与游戏的一方在脑海里想某个事物,其他参与者向他提问题,只允许提20个问题,问题的答案也只能用对或错回答,问问题的人通过推断分解,逐步缩小待猜测事物的范围。
上面介绍的K-近邻算法可以完成很多分类任务,但是它最大的缺点时无法给出数据的内在含义,决策树的主要优势就在于数据形式非常容易理解。
决策树详细算法可以参考下面这个链接,博主讲的很好:https://blog.csdn.net/jiaoyangwm/article/details/79525237
原文链接:https://blog.csdn.net/jiaoyangwm/article/details/79525237
原文链接:https://blog.csdn.net/shirakami00/article/details/120519518