赞
踩
有监督学习可以说是一种分类问题,通过已有的训练样本(已知数据及其对应的输出)去训练一个得到一个最优模型(模型是某个函数的集合,这里的最优模型是指在某个评价准则下的最优,具体问题具体分析)。再利用这个训练出来的模型将所有的输入映射成为相应的输出,对输出进行判断从而实现分类的目的。
这里我们可以通俗的说,就类似我们小时候在识事物,老师和家长会告诉你这是什么东西,这就是已知数据及其对应的输出,然后我们的脑子里会慢慢的形成一个泛化的意识,这个意识就是我们训练出来的模型(一种函数对应关系)。我们通过我们的意识看到某种东西,就可以反应出这是什么,这就是将所有的输入映射成为相应的输出。
KNN算法的核心思想是用距离目标数据最近的k个样本数据的分类来代表目标数据的分类。因此KNN也叫k-邻近算法。
我们可以先通俗的理解一下,比如判断我的职业,KNN就是通过人以群分的方法,如果我的身边的朋友多数是程序员,那么即判定我是个程序员。
如下图所示,我们存在一个训练样本集,而在样本集中存在特征和目标变量这两个概念,特征在下图中即图标的空间坐标,目标变量即图标的分类(三角形还是正方形)。因此我们在输入一个新的不含目标变量的数据(还未被分类),我们就通过KNN来判断他的目标变量。
简单演示一下KNN的过程(判断绿色圆的目标变量):
当k=3时,距离绿色圆最近的三个图标有两个为三角形,一个为正方形,我们判断未知数据的目标变量为三角形。
当k=5时,距离绿色圆最近的五个图标有两个为三角形,三个为正方形,我们判断未知数据的目标变量为正方形。
优点:算法简单,易于理解。对异常值不敏感(双刃剑)
缺点:结果受k值的影响大,k值的取值会影响结果的判定(k一般不超过20)。算法计算量大,需要计算每个样本的距离,虽然理解简单,但是不断的计算,不够优化。且当样本的分布不平衡的话,就无法准确判断(比如我是一个老师,但是我经常和程序员打交道,身边的朋友程序员占绝大多数,因此训练时我的身份被判定为程序员)。
(1)数据集的整理:有监督学习需要一个训练样本
(2)计算输入的测试数据和每个训练样本的数据的距离(两个公式)
欧 式 距 离 公 式 : d ( x , y ) = ∑ i = 1 n ( x i − y i ) 2 欧式距离公式:d(x,y)=\sqrt {\sum_{i=1}^n(x_{i}-y_{i})^2} 欧式距离公式:d(x,y)=i=1∑n(xi−yi)2
曼 哈 顿 距 离 公 式 : d ( x , y ) = ∑ i = 1 n ∣ x i − y i ∣ 曼哈顿距离公式:d(x,y)=\sum_{i=1}^n|x_{i}-y_{i}| 曼哈顿距离公式:d(x,y)=i=1∑n∣xi−yi∣
(3)按照距离递增排序
(4)选距离最近的k个点
(5)判断这个k点的分类概率
(6)将返回的最高的分类概率,该分类及测试数据的分类
#KNN算法分类器函数 from numpy import * import operator #函数参数:(测试数据,训练数据,分类标签,k值) def classify(inX,dataSet, labels, k): #dataSet.shape[0]指数据行数 dataSetSize = dataSet.shape[0] ''' 我们模拟一下下面的计算过程 假设测试数据(即输入)为[1,0,1] 训练数据为 [2,1,3] [1,2,3] [0,3,1] ==> 将测试数据域训练数据进行相减,得到 ==> [-1,-1,-2] [0,-2,-2] [1,-3,0] ==> 将相减结果进行平方,得到 ==> [1,1,2] [0,2,2] [1,3,0] ==> 将其相加 ==> [4] [4] [4] ==> 开方 ==> [2] [2] [2] ==> 排序得[2,2,2] ''' #相减 diffMat = tile(inX,(dataSetSize,1))-dataSet #平方 sqDiffMat=diffMat**2 #相加 sqDistances=sqDiffMat.sum(axis=1) #开方 distances=sqDistances**0.5 #计算欧式距离 #排序 sortedDistIndicies=distances.argsort() #排序并返回index #选择距离最近的k个值 classCount={} for i in range(k): voteIlabel=labels[sortedDistIndicies[i]] #计算每个类别出现的频率 classCount[voteIlabel]=classCount.get(voteIlabel,0)+1 #排序 sortedClassCount=sorted(classCount.items(),key=operator.itemgetter(1),reverse=True) return sortedClassCount[0][0]
通俗理解:判断我是哪里人,比如福建和浙江的交界处是一条分割线,我在分割线靠福建这块,就判断我为福建人,反之则为浙江人。
特征向量映射到空间的数据,有不同的目标变量(即分类),SVM的目的就是画出一条准确的线来区分这两种类别,在我们后续输入新的测试数据照样能很好的分类。
(1)SVM算法可以画出很多条分界线,但是每一条的效果不一样,如上图所示,绿线明显效果不好,蓝线还算凑合,红线的区分效果明显比较好。我们把最好的那条分界线称之为划分超平面(超平面指特征如果是高维的,这样的样本空间的最佳分界是一个超平面)
(2)在SVM算法训练出的分界中,以边际最大的的超平面称为划分超平面。边际指在里分界线(面)两边最近的两个样本数据的距离(如下图)。
算法会尽量的让边际变得更大,因为这样使得分类的犯错率减小。
https://blog.csdn.net/d__760/article/details/80387432
无监督学习的输入数据没有被标记,也无法通过输入已知他的输出结果。样本的数据类别是未知的,然后我们通过样本之间的相似程度对样本集进行分类(聚类)。通俗理解:儿童去动物园,不知道这个动物是啥,但是参观了一天下来,会发现老虎狮子是体型大的动物,兔子猴子是体型小的动物。类似这样去把所输入的知识通过数据间的相似性区分开来。(数据如下图)
推荐参考文章:https://blog.csdn.net/qq_29373285/article/details/82529333
(1)当我们有一个训练样本时(已标记)可以采取有监督学习(优先考虑)和无监督学习。但是如果正负样本的分布具有偏差(有小有大),那么这时我们有监督学习的效果就不如无监督学习了。(这里可以自己脑补上述KNN算法和SVM算法数据不平衡时的情况)
(2)当无训练样本一定不能使用有监督学习的方法。(没有分类无从下手)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。