2,机器学习和深度学习的应用:
3,机器学习类型
K-近邻算法(KNN)是 机器学习中的有监督学习中聚类模型
1,概念原理:K-近邻算法(K-Nearest Neighbour algorithm, KNN),是数据挖掘技术中原理最简单的算法。给定一个已知标签类别的训练数据集,输入没有标签的新数据后,在训练数据集中找到与新数据最邻近的K个实例,如果这K个实例中的多数属于某个类别,那么新数据就属于这个类别。简单理解为:由那些离X最近的K个点来投票 决定X归为哪一类。
举个栗子:使用k-近邻算法分类一个电影是爱情片还是动作片
在这个表格中, 每个电影有两个特征,我们可以通过人眼判断出新电影属于什么类型,那如果是N个呢?这就需要k-近邻算法上场啦!
我们将表格画为散点图如下:
通过观察,从散点图中大致判断,新电影是爱情片。那KNN算法是如何判断的呢? 没错,就是距离!
二维平面两点间距离公式:
N维空间两点间距离公式:
通过计算我们可以得到训练集中所有电影与未知电影的距离,如下表所示:
通过上表的计算结果,可以得出新电影到爱情片《后来的我们》距离最近,为29.1.如果仅仅根据这个结果,就判定新电影为爱情片,那这个算法就叫最近邻算法,而非k-近邻算法、
k-近邻算法步骤如下:
2,k-近邻算法的Python实现
#构建数据集
import pandas as pd
filmdata = {
'电影名称':['无问西东','后来的我们','前任3','红海行动','唐人街探案','战狼2'],
'打斗镜头':[1,5,12,108,112,115],
'接吻镜头':[101,89,97,5,9,8],
'电影类型':['爱情片','爱情片','爱情片','动作片','动作片','动作片',]
}
film_data = pd.DataFrame(filmdata)
print(film_data)
#计算已知类别中数据点与当前点的距离
new_data = [24,67]
dist = list( (((film_data.iloc[:6,1:3]-new_data)**2).sum(1))**0.5 )
print(dist)
#对距离进行排序,然后选择距离最近的k个点
k = 4
dist_l = pd.DataFrame( { 'dist':dist, 'labels':(film_data.iloc[:6,3]) } )
dr = dist_l.sort_values(by='dist')[:k]
print(dr)
3,封装函数
import pandas as pd
filmdata = {
'电影名称':['无问西东','后来的我们','前任3','红海行动','唐人街探案','战狼2'],
'打斗镜头':[1,5,12,108,112,115],
'接吻镜头':[101,89,97,5,9,8],
'电影类型':['爱情片','爱情片','爱情片','动作片','动作片','动作片',]
}
film_data = pd.DataFrame(filmdata)
new_data = [24,67]
'''
函数功能:KNN分类器
参数说明:
inX: 需要进行预测分类的数据集
dataSet: 已知分类标签的数据集(训练集 )
k: 超参数,选择距离最小的k个点
返回:
result: 预测分类结果
'''
def classify0(inX,dataSet,k):
result = []
dist = list((((dataSet.iloc[:, 1:3] - inX) ** 2).sum(1)) ** 0.5)
dist_l = pd.DataFrame({'dist': dist, 'labels': (dataSet.iloc[:, 3])})
dr = dist_l.sort_values(by='dist')[:k]
re = dr.loc[:, 'labels'].value_counts()
result.append(re.index[0])
return result
inX = new_data
dataSet = film_data
k = 4
print( classify0(inX,dataSet,k) )
这就是我们使用k-近邻算法构建的一个分类器,可以看出,分类器给的答案还是比较符合我们的预期的。
那么问题来了:分类器给出的答案是否永远都正确? 答案一定是否定的,分类器并不会得到100%正确的结果,我们可以使用很多方法来验证分类器的准确率。 此外,分类器的性能会受到很多因素的影响,比如 k的取值,就在很大程度上影响了分类器的预测结果,还有分类器的设置、原始数据集等等。 为了测试分类器的效果,我们可以把原始数据集分为两部分,一部分用来训练算法,称为训练集;另一部分用来测试算法的准确率,称为测试集。 我们不难发现,k-近邻算法没有进行数据的训练,直接使用未知的数据与已知的数据进行比较,得到结果,因此,k-近邻算法不具有显示的学习过程。
缺点: