1、使用python导入数据

from numpy import *
def createDataSet():group=array([[1.1,1.1],[1.0,1.0],[0,0],[0,0.1]])labels=['A','A','B','B']return group,labels

kNN分类算法:

from numpy import *
import operator
def classify0(inX,dataSet,labels,k):dataSetSize=dataSet.shape[0]    #shape[0]表示dataSet的行数diffMat=tile(inX,(dataSetSize,1))-dataSetsqDiffMat=diffMat**2sqDistances=sqDiffMat.sum(axis=1)distances=sqDistances**0.5sortedDistIndicies=distances.argsort()classCount={}for i in range(k):voteIlabel=labels[sortedDistIndicies[i]]classCount[voteIlabel]=classCount.get(voteIlabel,0)+1sortedClassCount=sorted(classCount.items(),key=operator.itemgetter(1),reverse=True)return sortedClassCount[0][0]

distances是1*4的矩阵,分别表示待分类的点与所有已知点的距离;sortedDistIndicies是distances从小到大的索引值;voteIlabel相当于临时变量,用来取得标签值;
classCount[voteIlabel]=classCount.get(voteIlabel,0)+1    如果在字典classCount中找到key=voteIlabel的value,就加1,找不到的话classCount.get(voteIlabel,0)返回0然后加1
sortedClassCount=sorted(classCount.items(),key=operator.itemgetter(1),reverse=True)  先把字典classCount变成列表,再按照第二维降序排列,返回的仍是列表

执行算法:

import kNN
from classify_kNN import *
g,l=kNN.createDataSet()
result=classify0([0,0],g,l,3)
print(result)

输出:

B


items():将字典中的项按照列表返回,无序:

get():返回字典对应key的value值,不存在key时返回第二个参数:

dic={'a':1,'b':2,'c':3}
print(dic.items())
print(dic.get('c','no'))
输出:
dict_items([('b', 2), ('c', 3), ('a', 1)])
3

shape:返回矩阵的维数;

from numpy import *
c=array([[1,1],[2,3,],[5,6]])
print(c)
print(c.shape)
print(c.shape[0])
print(c.shape[1])
输出:
[[1 1][2 3][5 6]]
(3, 2)
3
2

operator.itemgetter():返回对象特定维的数据,结合sorted()方法使用:

import operator
students=[['刚田武',20,'gangtw'],['朱二娃',25,'zhuerw'],['咪咪two',30,'miomitwo']]
print(sorted(students,key=operator.itemgetter(1),reverse=True))
输出:
[['咪咪two', 30, 'miomitwo'], ['朱二娃', 25, 'zhuerw'], ['刚田武', 20, 'gangtw']]

argsort():返回数组值从小到大的索引值


归一化数值:在计算欧氏距离的过程中,数值较大的属性对结果的贡献大,如果认为不同属性权重应该相同的话,就需要将数值归一化处理。

from numpy import *
def autoNorm(dataset):minVals=dataset.min(0)  #取每列的最小值,返回数组print(minVals)maxVals=dataset.max(0)print(maxVals)ranges=maxVals-minVals  #ranges是每列的最大值与最小值之差组成的数组print(ranges)normDataset=zeros(shape(dataset))print(normDataset)m=dataset.shape[0]  #取dataset的行数normDataset=dataset-tile(minVals,(m,1))print(normDataset)normDataset=normDataset/tile(ranges,(m,1))print(ranges)return normDataset

minVals=dataset.min(0)    #取数据集每列的最小值,返回数组

from numpy import *
dataset=array(([6,5],[3,1000],[10,300]))
print(dataset.min())    #返回所有元素中的最小值
print(dataset.min(0))   #返回每列的最小值组成的数组
print(dataset.min(1))   #返回每行的最小值组成的数组
输出:
3
[3 5]
[ 5  3 10]

m=dataset.shape[0] #取dataset的行数

from numpy import *
dataset=array(([6,5],[3,1000],[10,300]))
print(dataset.shape)    #返回数据集的“形状”,行数和列数
print(dataset.shape[0])     #返回行数
print(dataset.shape[1])     #返回列数
输出:
(3, 2)
3
2


测试分类器

def datingClassTest():hoRatio=0.1datingDataMat,datingLabels=file2matrix('datingTestSet2.txt')normMat,ranges,minVals=autoNorm(datingDataMat)m=normMat.shape[0]numTestVecs=int(m*hoRatio)errorCount=0for i in range(numTestVecs):classifyerResult=classify0(normMat[i,:],normMat[numTestVecs:m,:],datingLabels[numTestVecs:m],3)print('classify result is %s ,the real answer is %s'%(classifyerResult,datingLabels[i]))if classifyerResult!=datingLabels[i]:errorCount+=1print('the total error rate is %f'%(errorCount/float(numTestVecs)))

hoRatio=0.1  测试数据占数据集的10%


使用:输入各参数,输出分类结果:

def classifyPerson():resultList=['not at all','in small doses','in largr doses']timeOnGames=float(input('请输入游戏时间百分比:'))flyMiles=float(input('请输入每年飞行里程数:'))iceCream=float(input('请输入每周消耗的冰淇淋升数:'))datingDataMat,datingLabels=file2matrix('datingTestSet2.txt')normMat,ranges,minVals=autoNorm(datingDataMat)person2test=array([flyMiles,timeOnGames,iceCream])classifierResult=classify0((person2test-minVals)/ranges,normMat,datingLabels,5)print('you may like thie one:',resultList[classifierResult-1])

通过调节k值可以调整分类器的正确率。


使用k近邻算法识别手写数字

def handwritingClassTest():hwLabels=[]trainingFileList=listdir('digits/trainingDigits')m=len(trainingFileList)trainingMat=zeros((m,1024))for i in range(m):fileNameStr=trainingFileList[i]fileStr=fileNameStr.split('.')[0]classNumStr=int(fileStr.split('_')[0])hwLabels.append(classNumStr)trainingMat[i,:]=img2vector('digits/trainingDigits/%s'%fileNameStr)testFileList=listdir('digits/testDigits')errorCount=0mTest=len(testFileList)for i in range(mTest):fileNameStr=testFileList[i]fileStr=fileNameStr.split('.')[0]classNumStr=int(fileStr.split('_')[0])vectorUnderTest=img2vector('digits/testDigits/%s'%fileNameStr)classifierResult=classify0(vectorUnderTest,trainingMat,hwLabels,3)#print('分类结果:%s,实际结果:%s'%(classifierResult,classNumStr))if(classifierResult!=classNumStr):errorCount+=1print('分类错误总计:',errorCount)print('分类错误率:',errorCount/float(mTest))

注释:

trainingMat用来存储数据集,每个待测记录都要计算与此数据集之间的距离

hwLabels用来存储trainingMat对应的标签

fileNameStr存储文件名

fileStr存储不含后缀的文件名

classNumStr存储每条记录实际标签

vectorUnderTest表示待分类记录

计算分类错误率时,使用float()将int型数据变成浮点型

转载于:https://www.cnblogs.com/zhhy236400/p/9826347.html

机器学习 k-近邻算法相关推荐

  1. 机器学习——K近邻算法(KNN)(K Nearest Neighbor)

    参考视频与文献: python与人工智能-KNN算法实现_哔哩哔哩_bilibili 机器学习--K近邻算法(KNN)及其python实现_清泉_流响的博客-CSDN博客_python实现knn 机器 ...

  2. [机器学习]K近邻算法及其应用--WEKA工具

    K近邻算法理论基础 k近邻模型 距离度量 k值的选择 分类决策规则 WEKA实战 问题背景 数据预处理 得到分类器 对未知的数据进行分类预测 K近邻算法理论基础 (本节内容参考了:李航<统计学习 ...

  3. python机器学习 | K近邻算法学习(1)

    K近邻算法学习 1 K近邻算法介绍 1.1算法定义 1.2算法原理 1.3算法讨论 1.3.1 K值选择 1.3.2距离计算 1.3.3 KD树 2 K近邻算法实现 2.1scikit-learn工具 ...

  4. 2 机器学习 K近邻算法(KNN) 学习曲线 交叉验证 手写数字识别

    机器学习 1 K-近邻算法介绍 1.1 分类问题 分类问题:根据已知样本的某些特征,判断一个未知样本属于哪种样本类别. 与回归问题相比,分类问题的输出结果是离散值,用于指定输入的样本数据属于哪个类别. ...

  5. 机器学习[k近邻算法]

    k近邻算法简称kNN算法,由Thomas等人在1967年提出[1].它基于以下思想:要确定一个样本的类别,可以计算它与所有训练样本的距离,然后找出和该样本最接近的k个样本,统计这些样本的类别进行投票, ...

  6. 【机器学习-K近邻算法】

    K-近邻算法 K-近邻算法的快速入门 K-近邻(KNN)算法概念 殴式距离公式 电影分类案例 K-近邻算法API Scikit-learn工具 Scikit-learn包含内容 K-近邻算法API方法 ...

  7. 机器学习--K近邻算法(KNN)(2)

    一.简介 K-Nearest-Neighbor 算法是一种常用的监督学习算法,它没有显式的训练过程,是'懒惰学习'的显著代表,此类学习算法仅在训练阶段将训练集保存起来,训练时间开销为0,待收到测试样本 ...

  8. 机器学习——K近邻算法(KNN)及其python实现

    参考视频与文献: https://www.bilibili.com/video/BV1HX4y137TN/?spm_id_from=333.788&vd_source=77c874a500ef ...

  9. 机器学习——K近邻算法及乳腺癌检测分类

    一.引言 KNN可用于分类和回归,用于分类时是多分类方法. 注意:由于此方法根据预测点近邻的各类点的个数多少来确定该预测点的类别,因此原始类别数据不均衡,将严重影响最终分类效果. 二.KNN分类思想 ...

  10. 【机器学习入门】(1) K近邻算法:原理、实例应用(红酒分类预测)附python完整代码及数据集

    各位同学好,今天我向大家介绍一下python机器学习中的K近邻算法.内容有:K近邻算法的原理解析:实战案例--红酒分类预测.红酒数据集.完整代码在文章最下面. 案例简介:有178个红酒样本,每一款红酒 ...

最新文章

  1. 常见浏览器兼容问题、盒模型2种模式以及css hack知识讲解
  2. MySQL优化学习总结
  3. 更改记录表CDHDR和CDPOS
  4. Kafka 0.9 新消费者API
  5. AFNetworking 3.1.0 使用中某些知识点讲解
  6. 二、PHP基础——连接msql数据库进行增删改查操作 实战:新闻管理项目
  7. MIT科学家正在教AI感受电影中的喜怒哀乐
  8. 推荐系统经典模型 Wide Deep 论文剖析
  9. 使用jquery做一个动态简历
  10. Python 和Java 哪个更适合做自动化测试?
  11. 【初识】汽车诊断协议 UDS / DoIP
  12. allegro174的brd转alg文件导入AD异常
  13. 刷爆朋友圈,码农月薪七万可以落户北京啦
  14. @kubernetes(k8s)使用adm安装实现keepalived高可用
  15. 什么是.NET?什么是.NET Framework?什么是.NET Core?
  16. php关键词回复源码,PHP对接公众号搜索自动回复源码
  17. 42个机器学习练手项目
  18. 【整理】EFI/UEFI BIOS 入门 : All For Beginners
  19. linux 蓝牙 profile,Linux_Linux系统下蓝牙立体声配置A2DP profile,系统配置:Linux debian 2.6.22.6 #7 - phpStudy...
  20. 青龙面板-美团外卖天天神卷

热门文章

  1. 红米note3android驱动,为何我的红米NOTE3 装不了USB驱动
  2. 小米note3android8.0,小米Note3 lineage16 安卓9.0 极致省电 纯净 完美root Xposed 经典版...
  3. python未知长度数组,python – 从具有未知维数的numpy数组中提取超立方体块
  4. c/c++实现带图形界面的扫雷游戏
  5. 有权最短路径问题:狄克斯特拉(Dijkstra)算法 Java 实现
  6. Pycharm, 生成可执行文件,Unhandled exception in script报错
  7. 【CVPR 2021】Unsupervised Multi-Source Domain Adaptation for Person Re-Identification (UMSDA)
  8. mac怎么验机,都应该查什么
  9. squid FATAL: Received Segment Violation...dying.
  10. 帝恩思:网站被劫持跳转怎么办?