from numpy import * #引入numpy包
import operator#引入运算符模块
import KNN
"""
Parameters:
无
Returns:
group - 数据集
labels - 分类标签
"""
#创建数据集(包括数据和标签)
def createDataSet():
#六组二维特征
group=array([[3,104],[2,100],[1,81],[101,10],[99,5],[98,2]])#np.array(),NumPy库的函数创建多维数组
#六组特征的标签
labels=['爱情片','爱情片','爱情片','动作片','动作片','动作片']
return group, labels
#group,labels=KNN.createDataSet()
#print(group)
"""
Parameters:
inX - 用于分类的数据(测试集)
dataSet - 用于训练的数据(训练集)
labes - 分类标签
k - kNN算法参数,选择距离最小的k个点(选择最近邻居的数目)
Returns:
sortedClassCount[0][0] - 分类结果
"""
####为每组数据值分类,函数的功能是使用k-近邻算法将 每组数据划分到某个类中
def classify0(inX,dataSet,labels,K):
#numpy函数shape[0]返回dataSet的行数
dataSetSize=dataSet.shape[0]#获取数组的形状信息,0返回行数,1返回列数
# 在列向量方向上重复inX共1次(横向),行向量方向上重复inX共dataSetSize次(纵向)
diffMat=tile(inX,(dataSetSize,1))-dataSet#测试集和训练集之前的x,y上的差值,新(x,y)=(x_测-x_训练,y_测-y_训)
"""
c = np.array([[1, 2], [3, 4]])
d = np.tile(c, (2, 3))
print(d)
# 输出:
# [[1 2 1 2 1 2]
# [3 4 3 4 3 4]
# [1 2 1 2 1 2]
# [3 4 3 4 3 4]]
"""
##计算欧式距离
sqDiffMat= diffMat ** 2#计算距离的平方
sqDistances=sqDiffMat.sum(axis=1)#(x_测-x_训练)^2+y_测-y_训)^2
distances=sqDistances**0.5#开根号
##返回distances中元素从小到大排序后的索引值
sortedDistIndicies=distances.argsort()#argsort,返回数组排序后的索引,先从小到大排序然后再按照各个顺序返回数值没有排序前的索引
#argsort()返回最小的的数值的索引,之后返回第二小的索引
"""distances=[129.0736224 , 127.28314892, 117.13667231, 10. ,15.13274595,18.24828759])
sortedDistIndicies=[3, 4, 5, 2, 1, 0]
"""
classCount={}#创建空字典
for i in range(K):
# 取出前k个元素的类别
voteIlabel=labels[sortedDistIndicies[i]]
#计算类别次数
#classCount.get(voteIlabel, 0) 表示获取字典 classCount 中键为 voteIlabel 的值,如果不存在则返回0
classCount[voteIlabel] = classCount.get(voteIlabel, 0) + 1
#对键值进行排序
#classCount.items() 返回字典 classCount 中所有键值对的视图
# python3中用items()替换python2中的iteritems()
# key=operator.itemgetter(1)根据字典的值进行排序
# key=operator.itemgetter(0)根据字典的键进行排序
#reverse = True
#是排序函数的关键字参数,表示按照降序进行排序
sortedClassCount=sorted(classCount.items(),
key=operator.itemgetter(1),reverse=True)
#return sortedClassCount[0][0]
return distances,sortedDistIndicies
#KNN.classify0([101,20],group,labels,3)
if __name__ == '__main__':#主程序的入口,判断是否作为独立的脚本运行
#创建数据集
group, labels = createDataSet()
#测试集
test = [101,20]
#kNN分类
test_class = classify0(test, group, labels, 3)
#打印分类结果
print(test_class)
机器学习实战——knn
于 2023-10-26 18:31:51 首次发布