1.KNN(k-近邻算法)的例子
knn基本原理:
- 处理数据:将描述具体对象的属性和标签数据化。例如,如下的例子中,是已经处理好的的把电影的信息,把电影信息处理成了坐标上的点的横纵坐标。
- 用k-近邻算法的距离公式 ( t e s t 属 性 1 的 值 − 已 知 第 i 个 训 练 数 据 的 属 性 1 的 值 ) 2 + . . . + ( t e s t 属 性 m 的 值 − 已 知 第 i 个 训 练 数 据 的 属 性 m 的 值 ) 2 \sqrt{(test属性1的值-已知第i个训练数据的属性1的值){^2}+...+(test属性m的值-已知第i个训练数据的属性m的值){^2}} (test属性1的值−已知第i个训练数据的属性1的值)2+...+(test属性m的值−已知第i个训练数据的属性m的值)2,求得测试对象的各个属性与已知的分类器中已经分好的各个对象的属性的距离。
- 找到k个离测试对象最近的分类器中的对象,凭这k个中标签种类次数出现最多的那一个值,作为预测数据的标签。
总结:
- knn用于监督学习,监督学习的训练集是给了标签(目标值)的,当训练分类器分类好了之后,每个分块是对应上了标签的,当要拿预测数据拿来预测的时候,根据预测数据的属性(值)跟分类器的属性(值)的相似度(分析近不近),来预测预测数据是被分类器分类到哪一个区域。
- 监督学习和无监督学习的区别在于,拿来最开始训练的数据是否有标签,训练数据训练好分类器。
监督学习的训练数据有标签,依据训练数据训练成的分类器,依据分类器的分类规则,依据拿来预测对象的各种属性把对象分分类,就如此例中的knn算法就是一种监督学习,分类器已经根据训练数据把各种标签的区域划分出来,预测对象根据离哪个区域近就把预测对象的标为哪种标签(结果)。
无监督学习的训练数据没有标签,即训练数据本没有结果,训练数据本身是一些经验,预测的根据是根据之前的经验判断结果,例如我曾经了解过的apriori算法(关联分析算法),这个算法是受奶爸买啤酒和纸尿布的故事的启发,根据统计的属性1与属性i的关系大小,拿来预测如果出现属性1那么之后出现属性几,根据哪种的出现的概率大,那么输出的结果的就是属性几,这种无监督的学习本来就预先没有给训练集打上标签。
预测电影类型的代码示例:
import numpy as np
import operator
#knn基本原理
# 函数说明:创建数据集
def createDataSet():
#六组二维特征
group = np.array([[3,104],[2,100],[1,81],[101,10],[99,5],[98,2]])
#六组特征的标签
labels = ['爱情片','爱情片','爱情片','动作片','动作片','动作片']
return group, labels
# 函数说明:kNN算法,分类器
def classify0(inX, dataSet, labels, k):
'''
:param inX: 做测试的输入
:param dataSet: 得到的集群的位置[横坐标,纵坐标]
:param labels: 得到的datasetsd对应的标签
:param k: 取最近的k个
:return: 返回测试后的标签
'''
# 数据集大小
dataSetSize=dataSet.shape[0]
# 测试数据转化为dataSetSize行
inX=np.tile(inX,(dataSet.shape[0],1))
# print(inX)
#距离公式
#做差
diffMat=inX-dataSet
# print(diffMat)
#平方
Sq=diffMat**2
# print(Sq)
#求和
sum=np.sum(Sq,axis=1)
# print(sum)
#开方
sqrtDiff=sum**0.5
# print(sqrtDiff)
#选出最近的三组dataset
sortInx=np.argsort(sqrtDiff)
# print(sortInx)
dictory={}#{标签:个数}
for i in range(k):
#当前最近电影的标签
currentLabel=labels[sortInx[i]]
dictory[currentLabel]=dictory.get(currentLabel,0)+1
#降序排列字典,根据的‘个数’
dictory=sorted(dictory.items(),key=operator.itemgetter(1),reverse=True)
# print(dictory)
return dictory[0][0]
if __name__ == '__main__':
#创建数据集
group, labels = createDataSet()
#测试集
test = [101,20]
#kNN分类
test_class = classify0(test, group, labels, 3)
#打印分类结果
print(test_class)
输出:
动作片