今天开始学习机器学习,第一章是K-近邻算法,有不对的地方请指正
大概总结一下近邻算法写分类器步骤:
1. 计算测试数据与已知数据的特征值的距离,离得越近越相似
2. 取距离最近的K个已知数据的所属分类
3. 最后统计K个值的分类分别出现的概率,返回最多的一个属性,即为测试数据的所属分类
4. 至于怎么把文本转换成numpy的类型,需要学习numpy模块的相关知识,附上
numpy学习连接 http://old.sebug.net/paper/books/scipydoc/numpy_intro.html

#-*- coding:utf-8 *-*-from numpy import *
import operator   #计算模块
import matplotlib
import matplotlib.pyplot as plt
import time
import random
from mpl_toolkits.mplot3d import Axes3D
from os import listdir
import timedef createDataSet():group = array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]])labels = ['A','A','B','B']return group,labels#A,B分类
def classify0(inX, dataSet, labels, k):dataSetSize = dataSet.shape[0]diffMat = tile(inX,(dataSetSize,1)) - dataSet #tile函数把inx复制datasetsize行1列sqDiffMat = diffMat**2#print "sqDiffMat : ",sqDiffMatsqDistance = sqDiffMat.sum(axis = 1)distance = sqDistance**0.5#print "distance : ",distancesortedDistIndicies = distance.argsort()  #返回从小到大的元素的下标,比如[1 3 2 4].argsort()返回[0 2 1 3]#print "****",sortedDistIndiciesclassCount = {}for i in range(k):voteIlabel = labels[sortedDistIndicies[i]]   #统计各个现有值所属的特征向量#print sortedDistIndicies[i],voteIlabelclassCount[voteIlabel] = classCount.get(voteIlabel,0)+1  #统计各个特征向量出现的次数sortedClassCount = sorted(classCount.iteritems(),key = operator.itemgetter(1),reverse = True) #operator.itemgetter()从小到大排序#print "sortedClassCount : ",sortedClassCountreturn sortedClassCount[0][0]group,labels =  createDataSet()#print classify0([0,0], group, labels, 3)# # a = [('b',2),('a',1),('c',0)]
# a=[('b',2),('a',2),('a',1),('c',0)]
# b = sorted(a,key =  operator.itemgetter(0)) #优先根据第一个元素排序
# print b
# b = sorted(a,key =  operator.itemgetter(1)) #优先根据第二个元素排序
# print b
# b = sorted(a,key =  operator.itemgetter(1,0)) #优先根据第二个元素排序,当第二个元素相等的情况下根据第一个元素排序
# print b#解析数据
def file2matrix(filename):with open(filename) as f:lines = f.readlines()matrixNumber = len(lines)print 'the all lines is :',matrixNumber#matrix = zeros((matrixNumber,3),dtype = 'int') #生成空的n行3列的矩阵matrix = zeros((matrixNumber,2))vector = []index = 0     #矩阵索引for line in lines:line = line.strip()data = line.split("\t")matrix[index:] = data[0:2]   #把提取出来的复制到矩阵里面vector.append(int((data[-1])))  #最后一个特征值作为特征向量index+=1return matrix,vector#生成文本数据
def createdata(filename):with open(filename,'w') as f:for i in range(1000):r1 = int(random.random()*1000)r2 = 0if(0<=r1<=200):r2 = 1if(200<r1<=400):r2 = 2if(400<r1<=600):r2 = 3if(600<r1<=800):r2 = 4if(800<r1<=1000):r2 = 5r1 = str(r1)r2 = str(r2)#r2 = str(int(random.random()*10))r3 = str(int(random.random()*10))f.writelines(r3+'\t'+r1+'\t'+r2+'\n')#createdata(r'D:\test_packages\knntest.txt')'''
datat,labels = file2matrix(r'D:\test_packages\knntest.txt')
print datat
# print datat[:,1] #纵向的第二列
# print datat[:][1] #横向的第二列
print labels
fig = plt.figure()  #生成容器
plt.title('favorite table data')
ax = fig.add_subplot(1,1,1,projection='3d') #3D模型
ax.scatter(datat[:,0],datat[:,1],datat[:,2],array(labels),array(labels),array(labels))  #使用datat的第二列和第三列作为X轴和Y轴的值
ax.legend()
plt.show()fig = plt.figure()
ax = fig.add_subplot(1,1,1) #把容器划分为1行1列,图像画在第一格,背景颜色为axisbg = ‘’
ax.scatter(datat[:,1],datat[:,2],array(labels),array(labels))  #使用datat的第二列和第三列作为X轴和Y轴的值
#ax.grid(True) #是否显示网格
# plt.show()
plt.show()
'''#归一化,(old-min)/(max-min)
def autoNormal(dataSet):maxVals = dataSet.max(0)  #纵向找到每一个样本的最大特征值minVals = dataSet.min(0)ranges = maxVals - minVals #计算差值normalValue = zeros(shape(dataSet))m = dataSet.shape[0]normalValue = dataSet - tile(minVals,(m,1))   #计算(old-min)normalValue = normalValue/tile(ranges,(m,1))return normalValue,ranges,minVals#归一化特征值之后
datat,labels = file2matrix(r'D:\test_packages\knntest.txt')
normalValue,ranges,minVals = autoNormal(datat)
print normalValue
fig = plt.figure()
ax = fig.add_subplot(1,1,1) #把容器划分为1行1列,图像画在第一格,背景颜色为axisbg = ‘’
ax.scatter(normalValue[:,0],normalValue[:,1],array(labels),array(labels))  #使用datat的第二列和第三列作为X轴和Y轴的值
#ax.grid(True) #是否显示网格
# plt.show()
plt.show()#约会网站测试函数
def datinggTest():datat,labels = file2matrix(r'D:\test_packages\knntest.txt')normal,ranges,minvals = autoNormal(datat)testData = 0.5  #10%用来测试,90%用来训练testNumber = normal.shape[0]  #总行数numberTestValues = int(testNumber*testData)  #测试行数error = 0.0for i in range(numberTestValues):labelValue = classify0(normal[i,:], normal[numberTestValues:testNumber,:], labels[numberTestValues:testNumber], 3)if (labelValue != labels[i]):error+=1.0print "this time is error the error is %s, the right is %s"%(labelValue,labels[i])else:print "all right ,the number is %s, the right is %s"%(labelValue,labels[i])error_result = ((error/float(numberTestValues)))print "your error_result is %s"%(error_result)print 'error is :',error
datinggTest()#把二进制文件转化为np.array
def img2Vector(filename):with open(filename) as f:vector = zeros((1,1024))for i in range(32):line = f.readline()for j in range(32):vector[0,32*i+j] = line[j]return vector
vector = img2Vector(r'D:\test_packages\trainingDigits\0_0.txt')
print vector[0,11:17]#手写数字识别系统测试代码
def handwritingClassTest():startTime = time.ctime()handLabels = []trainFile = listdir(r'D:\test_packages\trainingDigits')m = len(trainFile)trainMat = zeros((m,1024))for i in range(m):fileName = trainFile[i]file = fileName.split('.')[0]classNumber = file.split('_')[0]handLabels.append(classNumber)trainMat[i,:] = img2Vector(r'D:\test_packages\trainingDigits\%s'%fileName) testFiles = listdir(r'D:\test_packages\testDigits')nTest = len(testFiles)error = 0.0for i in range(nTest):fileName = testFiles[i]file = fileName.split('.')[0]classNumber = file.split('_')[0]testMat = img2Vector(r'D:\test_packages\testDigits\%s'%fileName) testLabels = classify0(testMat, trainMat, handLabels, 3)if (testLabels != classNumber):error+=1.0print 'error , error number is %s, the right number is %s'%(testLabels,classNumber)else:print 'right'error = error/float(nTest)stopTime = time.ctime()print 'all right ,the error_result is %s'%(error)print 'the process start at %s'%(startTime)print 'the process stop at %s'%(stopTime)handwritingClassTest()

转载于:https://www.cnblogs.com/lq1024/p/7593639.html

机器学习实战K-近邻算法相关推荐

  1. 模式识别和机器学习实战-K近邻算法(KNN)- Python实现 - 约会网站配对效果判断和手写数字识别

    文章目录 前言 一. k-近邻算法(KNN) 1.算法介绍 2.举个例子--电影分类 3.步骤描述 4.来了--代码实现 二.实战之约会网站配对效果判断 1.导入数据 2.分析数据 3.数据归一化 4 ...

  2. 机器学习:k近邻算法(KNN)介绍

    k近邻算法是一种最简单最经典的机器学习算法之一.该算法的原理为:当对测试样本进行分类时,首先通过扫描训练样本集,找到与该测试样本最相似的k个训练样本,根据这个样本的类别进行投票确定测试样本的类别.也可 ...

  3. 机器学习之K近邻算法原理+应用实例

    1. 基本原理 K最近邻(K-Nearest Neighbor,KNN)分类算法是最简单的机器学习算法之一,其基本思路与"近朱者赤,近墨者黑"的原理类似,当对未分类样本进行分类时, ...

  4. 机器学习:K近邻算法

    一.K-近邻算法简介 1 什么是K-近邻算法 根据你的"邻居"来推断出你的类别 1.1 K-近邻算法(KNN)概念 K Nearest Neighbor算法又叫KNN算法,这个算法 ...

  5. 机器学习:K近邻算法(K-NN)

    K近邻(K-Nearest Neighbor, KNN)是一种最经典和最简单的有监督学习方法之一,它非常有效而且易于掌握. 1 K近邻算法概述 一个样本与数据集中的k个样本最相似, 如果这k个样本中的 ...

  6. 机器学习之k近邻算法

    本文的代码基于书本<机器学习实战> 概念 k-近邻算法采用测量不同特征值之间距离的方法进行分类.工作原理是:存在一个样本数据集合,称作训练样本集,样本中每个数据都存在标签.输入没有标签的新 ...

  7. 【机器学习】K近邻算法(K-NearestNeighbors , KNN)详解 + Java代码实现

    文章目录 一.KNN 基本介绍 二.KNN 核心思想 三.KNN 算法流程 四.KNN 优缺点 五.Java 代码实现 KNN 六.KNN 改进策略 一.KNN 基本介绍 邻近算法,或者说K最邻近(K ...

  8. python机器学习---1. K近邻算法

    机器学习的方法是基于数据产生的"模型" (model) 的算法,也称"学习算法" (learning algorithm).包括有监督学习(supervised ...

  9. 机器学习--从K近邻算法、距离度量谈到KD树、SIFT+BBF算法

    引言 最近在面试中,除了基础 &  算法 & 项目之外,经常被问到或被要求介绍和描述下自己所知道的几种分类或聚类算法(当然,这完全不代表你将来的面试中会遇到此类问题,只是因为我的简历上 ...

  10. k近邻算法_【机器学习】K近邻算法(KNN)

    点击关注上方"小田学python",获取更多精彩内容 机器学习是一门多领域交叉学科,涉及概率论.统计学.逼近论.凸分析.算法复杂度理论等多门学科.专门研究计算机怎样模拟或实现人类的 ...

最新文章

  1. java - 第一阶段总结
  2. java写微信小程序答辩问题_微信小程序毕业设计选题和毕业论文怎么写,答辩流程是怎样的?...
  3. cocos2d 环绕已知点移动一圈
  4. java ssh客户端_简单的Java SSH客户端
  5. WinCE控制面板添加应用程序
  6. CentOS7 使用firewald
  7. 几幅图,拿下 HTTPS
  8. jenkins 下载插件 一直失败_实用测试技能分享:jmeter+Jenkins性能测试自动化搭建...
  9. 在Seismic.NET下用最少的语句写出一个剖面显示程序
  10. 关联查询objectid_SAP 删除的BOM如何查询呢?
  11. 腾讯元老、上市公司CTO辞职后,每天对着200亩地发呆
  12. 植物大战僵尸的简单修改
  13. 人员轨迹监测系统设计
  14. Android 获取手机Ram 和 Rom大小
  15. (一)Activiti 数据库25张表——一般数据2 (ACT_GE_PROPERTY)
  16. vue中watch的详细用法,带deep,immediate
  17. 因融资失败倒闭 五分钟倒在黎明前五分钟
  18. FreeType 用法
  19. 线程安全、线程同步、线程间通信
  20. 【JAVA】-- 多线程(线程让步yield、线程插队join)

热门文章

  1. 手机/iPad异地远程桌面控制Windows电脑【无公网IP】
  2. 2018-DeepLabV3+论文解读
  3. 程序员工资一般多少_一般程序员真实工资 程序员工资薪酬大起底
  4. 可视化布局html5
  5. 蓝牙BT射频测试(转发)
  6. Unity强化学习之ML-Agents的使用
  7. 云计算业务发展迅速 或成资本角逐新战场
  8. 计算机启动硬盘自检,怎样取消电脑开机磁盘自检
  9. python实现时序异常检测_时序预测 01 - 异常检测 Smoothed z-score algorithm 标准化的一些实践、调参总结 -Python/pandas/numpy...
  10. 初中英语语法(014)-现在完成时