diff --git "a/20-K-\350\277\221\351\202\273\345\210\206\347\261\273\347\256\227\346\263\225\345\210\235\346\255\245-\345\276\256\351\241\271\347\233\256-\347\254\254\345\233\233\345\215\225\345\205\203 \346\225\260\346\215\256\347\273\223\346\236\204\347\232\204\345\272\224\347\224\250/README.md" "b/20-K-\350\277\221\351\202\273\345\210\206\347\261\273\347\256\227\346\263\225\345\210\235\346\255\245-\345\276\256\351\241\271\347\233\256-\347\254\254\345\233\233\345\215\225\345\205\203 \346\225\260\346\215\256\347\273\223\346\236\204\347\232\204\345\272\224\347\224\250/README.md" index 86ad7982253c091b6034e6f9c93b7382683b17a3..36d433f9c2c1577bbdc8fc8331a107bd053327f6 100644 --- "a/20-K-\350\277\221\351\202\273\345\210\206\347\261\273\347\256\227\346\263\225\345\210\235\346\255\245-\345\276\256\351\241\271\347\233\256-\347\254\254\345\233\233\345\215\225\345\205\203 \346\225\260\346\215\256\347\273\223\346\236\204\347\232\204\345\272\224\347\224\250/README.md" +++ "b/20-K-\350\277\221\351\202\273\345\210\206\347\261\273\347\256\227\346\263\225\345\210\235\346\255\245-\345\276\256\351\241\271\347\233\256-\347\254\254\345\233\233\345\215\225\345\205\203 \346\225\260\346\215\256\347\273\223\346\236\204\347\232\204\345\272\224\347\224\250/README.md" @@ -1,34 +1,141 @@ # 20-K-近邻分类算法初步-微项目-第四单元 数据结构的应用 ### 一、项目主题 + +怎样让计算机根据照片来辨别鲜花的品种、根据内容来过滤垃圾邮件、根据镜头内容来区分电影的类别? + +这类操作实现是基于机器学习,那么机器学习最简单的入门级算法莫过于用K-近邻(K-Nearest Neiglhbors.KNN)分类算法来实现。 + ### 二、项目内容 #### 1.项目背景 + +这是《机器学习》的一个入门级算法,k-近邻算法,也叫KNN。 + +k-近邻算法是用于分类。分类问题是监督学习算法的一个研究方向。 + +既然是属于监督学习的,就需要1个训练数据集作为判断的基础,以此为基础来判断歆样本所属类型。 + + #### 2.项目设计依据 + +分类是机械学习中面对的一个重要算法之一,而k-邻近算法又是入门的算法,以二维坐标点归类为例,引导学生从已有的认知水平和实践能力出发,针对给定的项目任务进行分析,对问题进行梳理,确要解决的关键问题,并能提取问题的基本特征,进行抽象建模,用算法描述解决问题的方案,并根据解决方案编写程序直至问题解决,得出结论。 + + #### 3.项目概述 + +本项目的实施可以分别采用顺序查找算法。在实现的过程中,掌握算法的思想和实现。通过本项目的学习,学生了解查找算法执行过程,初步形成查找思想解决问题的能力。使用Python语言编写程序,调试运行后得出结果,并能和其他同学进行展示交流。 + + ### 三、项目指导 + +学生需要在理解、体验和分析的基础上,围绕下列问题进行思考: + +1.训练数据集有哪些数据项? + +2.如何储存数据? + +3.选练级数据如何进行分类? + +4.采用什么算法进行查找比较合适? + +5.被查找的数据序列是否需要有序?需要的话,如何进行排序? + + ### 四、项目实施流程 + +本项目出自高中选择性必修1《数据与数据结构》的第五章 数据结构与算法 第3节 数据排序 中的实践与体验活动,尝试用最简单的初中教材知识来解决高中的问题。训练同学利用已学知识解决未知问题。通过整个项目实施过程,能够让同学们对实际问题的剖析,算法的设计的各个环节、题目分析、Python的基本控制结构以及不同的数据类型等内容在项目中进行综合应用。具体安排如下: + +机器学习-近邻算法开发一般流程: + +1)收集数据:使用各种方法收集数据 + +2)准备数据:距离计算所需要的数值,就是整理数据为可以计算的数值 + +3)分析数据:可以使用任何方法 + +4)训练算法:k-近邻算法不需要训练,可以直接使用上一步的代码 + +5)测试算法:计算错误率 + +6)使用算法:首先输入样本数据和结构化的输出结果,然后运行k-近邻算法判定输入数据分别属于哪个分类,最后应用对计算出的分类执行后续的处理 + +当然,一开始我们使用数据都是比较简单。使用自己拟定的数据,可以直接开始写k-近邻算法的代码。 + ### 五、项目实施环节安排 #### 第一阶段:项目准备阶段 -1. 确定项目主题 +1.分析问题,将问题模块化,明确问题组成 2. 项目需求分析与总体规划 +(1)明确项目实现的功能以及项目输入(即处理对象或原始数据)与输出(即处理结果)。 + +(2)明确每个阶段需要完成的任务。 -3. 分组、分工 +3. 将各模块化问题利用python基础算法来解决 #### 第二阶段:项目的指导阶段 + 1. 抽象与建模 +该算法的核心思想是:一个样本在特征空间中的k个报最相部的样本中的大多数属于某一个类别,则该样本也属于这个类别。 +如图536![输入图片说明](%E5%9B%BE5.3.6%20%E4%BA%8C%E7%BB%B4%E5%9D%90%E6%A0%87%E4%B8%AD%E7%82%B9%E7%9A%84%E5%88%86%E5%B8%83%E6%83%85%E5%86%B5.png) + +所示,在二维坐标中有六个点,分别是al(1,20),a2(1,16),a3(1,3),bl(25,15),b2(25,10),b3(25.2)。 + +其中,al,a2,a3为A类,bl,b2,b3为B类。 + +判定c(14,1)点属于哪个类别, 2. 设计算法 +距离公式:![输入图片说明](%E8%B7%9D%E7%A6%BB%E5%85%AC%E5%BC%8F.png) + +勾股定理:![输入图片说明](%E5%8B%BE%E8%82%A1%E5%AE%9A%E7%90%86%E5%85%AC%E5%BC%8F.png) + +1.计算c点和其余所有点的距离(两点间的距离计算公式:d12=√[(x1-x2)²+(y1-y2)²]。 + +2.按距离升序排序。 + +3.取前k(样本的k个最近邻居,k小于等于样本个数)个距离。 + +4.统计出在前k个距离中,出现频次最多的类别,则c点就属于该类别。 + 3. 项目程序实现 +根据算法分析,将程序划分成不同的阶段。通过讨论得出程序的编写方法,成员各自编写自己的算法,最后讨论交 流并统一测试若干组测试数据以验证程序的正确性。 + +实践步骤: +1.如图5.3.7所示的样本数据,输入k(k≤6)的值。 +2.按照K-近邻分类算法编写程序。 +3.调试程序,输出c点的类别。 +![输入图片说明](%E5%9B%BE5.3.7%20%E6%A0%B7%E6%9C%AC%E6%95%B0%E6%8D%AE.png) + +结果呈现: +当k值为4时,c点属于B类。 #### 第三阶段:项目汇报阶段 + +1.学生制作项目汇报材料。 + +(1)展示与分享项目成果。 +(2)对完成项目的感悟,总结项目的实施流程。 +(3)回顾项目实施过程中存在的困难及解决途径。 + +2.教师组织学生对每个小组项目进行评价。 + ### 六、项目汇报环节安排 +1.教学导入 + +鼓励学生作为小组项目发言人,自主准备汇报材料,介绍自己所在小组项目实施的过程、成果、意义及感悟,以期待得到同学的 “认可”。引导学生以项目评价量化表为标准,客观给予评价。汇报的内容和形式自定,可以是文稿演示、成果报告、展板展示、项目实 施手册展示和项目活动过程陈述等方式。教师对小组汇报的项目研究报告进行打分,并对评选出的最佳小组给予奖励。汇报过程对学生来说是一个非常重要的学习经历,也是对学生的总结反思、整理资料能力及写作能力的一次挑战。 + +2.分组汇报    + +每个项目研究小组派小组代表采用合适的方式汇报小组的项目经历与成果。 + +3.学生提问,教师点评,评价打分 +根据“项目成果”进行评价,并记录同学们提出的意见.每个小组可以根据同学们的评价进一步地修改项目中存在的问题,将自评、他评、师评和专家评价结合起来,借助信息技术更及 时呈现评价结果。为了激励学生并检验各组的项目成果,教师合理评价并为“最佳”项目成果颁发奖项,以评价的形式引导学生梳理、总结项目成果 diff --git "a/20-K-\350\277\221\351\202\273\345\210\206\347\261\273\347\256\227\346\263\225\345\210\235\346\255\245-\345\276\256\351\241\271\347\233\256-\347\254\254\345\233\233\345\215\225\345\205\203 \346\225\260\346\215\256\347\273\223\346\236\204\347\232\204\345\272\224\347\224\250/knn-(\346\235\216\351\235\226-\347\216\213\347\234\237\347\210\261).py" "b/20-K-\350\277\221\351\202\273\345\210\206\347\261\273\347\256\227\346\263\225\345\210\235\346\255\245-\345\276\256\351\241\271\347\233\256-\347\254\254\345\233\233\345\215\225\345\205\203 \346\225\260\346\215\256\347\273\223\346\236\204\347\232\204\345\272\224\347\224\250/knn-(\346\235\216\351\235\226-\347\216\213\347\234\237\347\210\261).py" new file mode 100644 index 0000000000000000000000000000000000000000..3c06436df9cba879e961f659167dd15b9cdf4890 --- /dev/null +++ "b/20-K-\350\277\221\351\202\273\345\210\206\347\261\273\347\256\227\346\263\225\345\210\235\346\255\245-\345\276\256\351\241\271\347\233\256-\347\254\254\345\233\233\345\215\225\345\205\203 \346\225\260\346\215\256\347\273\223\346\236\204\347\232\204\345\272\224\347\224\250/knn-(\346\235\216\351\235\226-\347\216\213\347\234\237\347\210\261).py" @@ -0,0 +1,153 @@ +# 作者:李靖、王真爱 +'''以下为样本数据集''' +group = [[1, 20], [1, 16], [1, 3], [25, 15], [25, 10], [25, 2]] # 提前保存样本数据 +labels1 = ['A', 'A', 'A', 'B', 'B', 'B'] # 保存各样本数据对应的分类类型 +labels2 = [1, 1, 1, 2, 2, 2] # 将样本分类数字化 + + +'''以下为计算待分类数据与样本的最小值''' +a1 = [] # 待用,用于保存最小值 +b1 = [] # 待用,用于制作a1数组副本 +b2 = [] # 待用,用于保存a1中各个值在当前数组中的排名 +z = [[14, 1]] # 待分类数据 +x = [] # 保存横坐标差值 +y = [] # 保存纵坐标差值 + +for i in range(6): + t = 0 + j = 0 + t1 = group[i][j]-z[0][0] # 待分类数据X轴与样本X轴差值 + x.append(t1) + t2 = group[i][j + 1]-z[0][1] # 待分类样本数据Y轴与样本Y轴差值 + y.append(t2) + +for i in range(6): + t3 = round(float((x[i]**2 + y[i]**2)**0.5), 3) # 计算待分类数据与样本的最小距离,精确到三位小数 + a1.append(t3) + t3 = 0 + +for i in range(5): + j=5-i + for j in range(5-j): + if a1[i] <= a1[i+1]: + t3 = i + 1 + +print("a1 = ", a1) # 测试代码,便于验证 + +s1 = len(a1) +for i in range(s1): # 将最小距离数据保存到另一数组中 + b1.append(a1[i]) + +print("b1 = ", b1) # 测试代码,便于验证 + + +'''以下为排序''' +s2 = len(b1) +for i in range(s1): # 创建空数组用于存放a1中各个最小值的排名 + b2.append(0) +print("b2 = ", b2) # 测试代码,便于验证 +print("a1长度为:", s1) # 测试代码,便于验证 + +kim = 0 +nex = 0 + +for i in range(s1-1): + temp = 0.0 # 存放当前循环中找到的最小值 + temp2 = 0.0 + kim = 0 + nex = kim + 1 + print(kim, nex) + while True: # 假设收个数据为最小值,与之后的所有数据进行比较,得到当前循环中的最小值 + if len(b1) == 1: + break + elif nex == len(b1) or kim == len(b1) - 1: + break + elif b1[kim] <= b1[nex]: + temp = b1[kim] + kim = kim + nex = nex + 1 + continue + else: + temp = b1[nex] + kim = nex + nex = nex + 1 + continue + + print("最小值位置", kim + 1) # 测试代码,便于验证,输出当前循环找到的最小值 + b1.pop(kim) + print("移除", temp) # 测试代码,便于验证,将当前循环找到的最小值从a1副本数组b1中删除 + print(b1) + k = 0 + + while True: # 将当前循环找到的最小值排名保存到对应的b2数组中 + if a1[k] != temp: + k = k + 1 + continue + else: + b2[k] = i + 1 + break + print(b2) # 测试代码,便于验证 + + if len(b1) == 1: + temp2 = b1[0] + print("剩余", b1) # 测试代码,便于验证 + k = 0 + while True: + if a1[k] != temp2: + k = k + 1 + continue + else: + b2[k] = s1 + break + print(b2) # 输出已找到的最小值排名数组 + +print("b2 = ", b2) # 整个数组排序完毕后,将a1数组中各个最小值的排名b2数组输出 + + +'''以下为输入K值的大小将分类结果输出''' +k = int(input("请输入K值大小:")) +print(k) +k1 = 0 # 记录当前排名 +k2 = 0 # 寻找当前最小值位置 +k3 = 0 # 记录属于A等的个数 +k4 = 0 # 记录属于B等的个数 +while True: + k1 = k1 + 1 + k2 = 0 + if k > s1 or k == 0: # 判断K值是否小于或大于样本个数,输出提示! + print("超出范围,无效!!!") + break + elif k1 <= k: # K值正常的话,根据K值大小,从b2数组中的最小值开始逐一查找,并将查找到的结果A和B个数分别保存到K3和K4中 + while True: + print("K2:", k2) # 测试代码,便于验证 + print("K1:", k1) # 测试代码,便于验证 + if k2 > s1: # 当遍历到最后一个数据时跳出当前循环 + break + elif k2 <= s1 and b2[k2] == k1 and labels1[k2] == 'A': # 用K3保存在当前K值下,A的个数 + k3 = k3 + 1 + k2 = k2 + 1 + print("A的个数K3:", k3) # 测试代码,便于验证 + print("K2:", k2) # 测试代码,便于验证 + print("K1:", k1) # 测试代码,便于验证 + break + elif k2 <= s1 and b2[k2] == k1 and labels1[k2] == 'B': # 用K4保存在当前K值下,B的个数 + k4 = k4 + 1 + k2 = k2 + 1 + print("B的个数K4:", k4) # 测试代码,便于验证 + print("K2:", k2) # 测试代码,便于验证 + print("K1:", k1) # 测试代码,便于验证 + break + else: + k2 = k2 + 1 + else: + break + + +'''以下为根据计算得到的A和B的个数,对分类结果进行判断''' +k1 = k1 - 1 +if k3 == k4 and k3 != 0 and k4 != 0: # 最终根据计算得到的K3和K4值的大小,将样本数据进行归类。 + print("该样本可能属于A,也可能属于B") +elif k3 > k4: + print("该样本很可能属于A") +elif k3 < k4: + print("该样本很可能属于B") \ No newline at end of file diff --git "a/20-K-\350\277\221\351\202\273\345\210\206\347\261\273\347\256\227\346\263\225\345\210\235\346\255\245-\345\276\256\351\241\271\347\233\256-\347\254\254\345\233\233\345\215\225\345\205\203 \346\225\260\346\215\256\347\273\223\346\236\204\347\232\204\345\272\224\347\224\250/\345\213\276\350\202\241\345\256\232\347\220\206\345\205\254\345\274\217.png" "b/20-K-\350\277\221\351\202\273\345\210\206\347\261\273\347\256\227\346\263\225\345\210\235\346\255\245-\345\276\256\351\241\271\347\233\256-\347\254\254\345\233\233\345\215\225\345\205\203 \346\225\260\346\215\256\347\273\223\346\236\204\347\232\204\345\272\224\347\224\250/\345\213\276\350\202\241\345\256\232\347\220\206\345\205\254\345\274\217.png" new file mode 100644 index 0000000000000000000000000000000000000000..b842601c6fe73de8cac603c8dd7ec9ca6c0e3392 Binary files /dev/null and "b/20-K-\350\277\221\351\202\273\345\210\206\347\261\273\347\256\227\346\263\225\345\210\235\346\255\245-\345\276\256\351\241\271\347\233\256-\347\254\254\345\233\233\345\215\225\345\205\203 \346\225\260\346\215\256\347\273\223\346\236\204\347\232\204\345\272\224\347\224\250/\345\213\276\350\202\241\345\256\232\347\220\206\345\205\254\345\274\217.png" differ diff --git "a/20-K-\350\277\221\351\202\273\345\210\206\347\261\273\347\256\227\346\263\225\345\210\235\346\255\245-\345\276\256\351\241\271\347\233\256-\347\254\254\345\233\233\345\215\225\345\205\203 \346\225\260\346\215\256\347\273\223\346\236\204\347\232\204\345\272\224\347\224\250/\345\233\2765.3.6 \344\272\214\347\273\264\345\235\220\346\240\207\344\270\255\347\202\271\347\232\204\345\210\206\345\270\203\346\203\205\345\206\265.png" "b/20-K-\350\277\221\351\202\273\345\210\206\347\261\273\347\256\227\346\263\225\345\210\235\346\255\245-\345\276\256\351\241\271\347\233\256-\347\254\254\345\233\233\345\215\225\345\205\203 \346\225\260\346\215\256\347\273\223\346\236\204\347\232\204\345\272\224\347\224\250/\345\233\2765.3.6 \344\272\214\347\273\264\345\235\220\346\240\207\344\270\255\347\202\271\347\232\204\345\210\206\345\270\203\346\203\205\345\206\265.png" new file mode 100644 index 0000000000000000000000000000000000000000..e0dd6daa68a9dddb4449872672286e9ab2f0de91 Binary files /dev/null and "b/20-K-\350\277\221\351\202\273\345\210\206\347\261\273\347\256\227\346\263\225\345\210\235\346\255\245-\345\276\256\351\241\271\347\233\256-\347\254\254\345\233\233\345\215\225\345\205\203 \346\225\260\346\215\256\347\273\223\346\236\204\347\232\204\345\272\224\347\224\250/\345\233\2765.3.6 \344\272\214\347\273\264\345\235\220\346\240\207\344\270\255\347\202\271\347\232\204\345\210\206\345\270\203\346\203\205\345\206\265.png" differ diff --git "a/20-K-\350\277\221\351\202\273\345\210\206\347\261\273\347\256\227\346\263\225\345\210\235\346\255\245-\345\276\256\351\241\271\347\233\256-\347\254\254\345\233\233\345\215\225\345\205\203 \346\225\260\346\215\256\347\273\223\346\236\204\347\232\204\345\272\224\347\224\250/\345\233\2765.3.7 \346\240\267\346\234\254\346\225\260\346\215\256.png" "b/20-K-\350\277\221\351\202\273\345\210\206\347\261\273\347\256\227\346\263\225\345\210\235\346\255\245-\345\276\256\351\241\271\347\233\256-\347\254\254\345\233\233\345\215\225\345\205\203 \346\225\260\346\215\256\347\273\223\346\236\204\347\232\204\345\272\224\347\224\250/\345\233\2765.3.7 \346\240\267\346\234\254\346\225\260\346\215\256.png" new file mode 100644 index 0000000000000000000000000000000000000000..4f0a8afb067d5cc554f2193231cd819bc07ea9e5 Binary files /dev/null and "b/20-K-\350\277\221\351\202\273\345\210\206\347\261\273\347\256\227\346\263\225\345\210\235\346\255\245-\345\276\256\351\241\271\347\233\256-\347\254\254\345\233\233\345\215\225\345\205\203 \346\225\260\346\215\256\347\273\223\346\236\204\347\232\204\345\272\224\347\224\250/\345\233\2765.3.7 \346\240\267\346\234\254\346\225\260\346\215\256.png" differ diff --git "a/20-K-\350\277\221\351\202\273\345\210\206\347\261\273\347\256\227\346\263\225\345\210\235\346\255\245-\345\276\256\351\241\271\347\233\256-\347\254\254\345\233\233\345\215\225\345\205\203 \346\225\260\346\215\256\347\273\223\346\236\204\347\232\204\345\272\224\347\224\250/\350\267\235\347\246\273\345\205\254\345\274\217.png" "b/20-K-\350\277\221\351\202\273\345\210\206\347\261\273\347\256\227\346\263\225\345\210\235\346\255\245-\345\276\256\351\241\271\347\233\256-\347\254\254\345\233\233\345\215\225\345\205\203 \346\225\260\346\215\256\347\273\223\346\236\204\347\232\204\345\272\224\347\224\250/\350\267\235\347\246\273\345\205\254\345\274\217.png" new file mode 100644 index 0000000000000000000000000000000000000000..173ef63109ff9864e10dc85863efe33d4886c4db Binary files /dev/null and "b/20-K-\350\277\221\351\202\273\345\210\206\347\261\273\347\256\227\346\263\225\345\210\235\346\255\245-\345\276\256\351\241\271\347\233\256-\347\254\254\345\233\233\345\215\225\345\205\203 \346\225\260\346\215\256\347\273\223\346\236\204\347\232\204\345\272\224\347\224\250/\350\267\235\347\246\273\345\205\254\345\274\217.png" differ