【风马一族_Python】 实施kNN算法
一、在PyCharm 5.0.4(编写python程序的IDE) 编写kNN.py文件的代码
--------------------------
1、 kNN.py 运算符模块
--------------------------
from numpy import *
import operator #运算符模块 创建数据集和标签
def createDataSet():
group = array([[1.0, 1.1], [1.0, 1.0], [0, 0], [0, 0.1]])
labels = ['A', 'A', 'B', 'B']
return group, labels
1)、打开命令行
先进入kNN.py的所在文件夹,在对kNN.py进行程序处理,效果如下图所示
--------------------------
2、 kNN.py k-近邻算法
--------------------------
from numpy import *
import operator #运算符模块
def createDataSet():
group = array([[1.0, 1.1], [1.0, 1.0], [0, 0], [0, 0.1]])
labels = ['A', 'A', 'B', 'B']
return group, labels #k-近邻算法 此模块需要使用运算符模块的group/labels
def classify0(inX, dataSet, labels, k):
dataSetSize = dataSet.shape[0]
diffMat = tile(inX, (dataSetSize, 1)) - dataSet
sqDiffMat = diffMat ** 2
sqDistances = sqDiffMat.sum(axis=1)
distances = sqDistances ** 0.5
sortedDistIndicies = distances.argsort()
classCount = {}
for i in range(k):
voteIlabel = labels[sortedDistIndicies[i]]
classCount[voteIlabel] = classCount.get(voteIlabel, 0) + 1 sortedClassCount = sorted(classCount.iteritems(),
key=operator.itemgetter(1),
reverse=True)
return sortedClassCount[0][0]
2) 在1)的基础上,进行2)的内容,可以修改参数


--------------------------
3、 kNN.py 准备数据:从文本文件中解析数据
--------------------------
# 将文本记录转换为NumPy的解析程序
def file2matrix(filename):
fr = open(filename,'r')
numberOfLines = len(fr.readlines()) # get the number of lines in the file
returnMat = zeros((numberOfLines, 3)) # prepare matrix to return
classLabelVector = [] # prepare labels return
fr = open(filename)
index = 0
for line in fr.readlines():
line = line.strip()
listFromLine = line.split('\t')
returnMat[index, :] = listFromLine[0:3]
classLabelVector.append(int(listFromLine[-1]))
index += 1
return returnMat, classLabelVector
datingTestSet2.txt文件可以从(博客园)文件下载

--------------------------
4、 kNN.py 使用Matplotlib创建散点图
--------------------------

datingTestSet2.txt 文件的数据通过matplotlib,图形化的表现出来

--------------------------
5、 kNN.py 使用Matplotlib创建散点图 表示不同属性的点,使用不同颜色进行表示
警告:import os
from numpy import *
这两句必须加上,否则会报如下,错误提示信息:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'array' is not defined
--------------------------

让点出现颜色划分的关键代码是:
ax.scatter(datingDataMat[:,1],datingDataMat[:,2],15.0*array(datingLabels),15.0*array(datingLabels))

--------------------------
6、 kNN.py 归一化特征值
--------------------------
1 # 归一化特征值
2 def autoNorm(dataSet):
3 minVals = dataSet.min(0)
4 maxVals = dataSet.max(0)
5 ranges = maxVals - minVals
6 normDataSet = zeros(shape(dataSet))
7 m = dataSet.shape[0]
8 normDataSet = dataSet - tile(minVals, (m, 1))
9 normDataSet = normDataSet / tile(ranges, (m, 1))
10 return normDataSet, ranges, minVals

--------------------------
7、 kNN.py 分类器针对约会网站的测试代码
--------------------------
# 分类器针对约会网站的测试代码
def datingClassTest():
hoRatio = 0.10
datingDataMat, datingLabels = file2matrix('datingTestSet2.txt')
normMat, ranges, minVals = autoNorm(datingDataMat)
m = normMat.shape[0]
numTestVecs = int(m * hoRatio)
errorCount = 0.0
for i in range(numTestVecs):
classifierResult = classify0(normMat[i, :], normMat[numTestVecs:m, :], datingLabels[numTestVecs:m], 3)
print "the classifier came back with: %d, the real answer is : %d" % (classifierResult, datingLabels[i]) if (classifierResult != datingLabels[i]):
errorCount += 1.0 print "the total error rate is : %f " % (errorCount / float(numTestVecs))

--------------------------
8、 kNN.py 使用算法:构建完整可用系统
--------------------------
#! /usr/bin/env python
# -*- coding: gbk -*- 用来解决中文乱码的注解 from numpy import *
import operator # 运算符模块
def createDataSet():
group = array([[1.0, 1.1], [1.0, 1.0], [0, 0], [0, 0.1]])
labels = ['A', 'A', 'B', 'B']
return group, labels # k-近邻算法
def classify0(inX, dataSet, labels, k):
dataSetSize = dataSet.shape[0]
diffMat = tile(inX, (dataSetSize, 1)) - dataSet
sqDiffMat = diffMat ** 2
sqDistances = sqDiffMat.sum(axis=1)
distances = sqDistances ** 0.5
sortedDistIndicies = distances.argsort()
classCount = {}
for i in range(k):
voteIlabel = labels[sortedDistIndicies[i]]
classCount[voteIlabel] = classCount.get(voteIlabel, 0) + 1 sortedClassCount = sorted(classCount.iteritems(),
key=operator.itemgetter(1),
reverse=True)
return sortedClassCount[0][0] # 将文本记录转换为NumPy的解析程序
def file2matrix(filename):
fr = open(filename, 'r')
numberOfLines = len(fr.readlines()) # get the number of lines in the file
returnMat = zeros((numberOfLines, 3)) # prepare matrix to return
classLabelVector = [] # prepare labels return
fr = open(filename)
index = 0
for line in fr.readlines():
line = line.strip()
listFromLine = line.split('\t')
returnMat[index, :] = listFromLine[0:3]
classLabelVector.append(int(listFromLine[-1]))
index += 1
return returnMat, classLabelVector # 归一化特征值
def autoNorm(dataSet):
minVals = dataSet.min(0)
maxVals = dataSet.max(0)
ranges = maxVals - minVals
normDataSet = zeros(shape(dataSet))
m = dataSet.shape[0]
normDataSet = dataSet - tile(minVals, (m, 1))
normDataSet = normDataSet / tile(ranges, (m, 1))
return normDataSet, ranges, minVals # 分类器针对约会网站的测试代码
def datingClassTest():
hoRatio = 0.10
datingDataMat, datingLabels = file2matrix('datingTestSet2.txt')
normMat, ranges, minVals = autoNorm(datingDataMat)
m = normMat.shape[0]
numTestVecs = int(m * hoRatio)
errorCount = 0.0
for i in range(numTestVecs):
classifierResult = classify0(normMat[i, :], normMat[numTestVecs:m, :], datingLabels[numTestVecs:m], 3)
print "分类器的回复是:%d,真正的答案是:%d" % (classifierResult, datingLabels[i]) if (classifierResult != datingLabels[i]):
errorCount += 1.0 print "总误差率 : %f " % (errorCount / float(numTestVecs)) # 约会网预测函数
def classifyPerson():
resultList = ['完全没有兴趣', '有一点吧', '特别感兴趣']
percentTats = float(raw_input("玩电子游戏的时间百分比?"))
ffMiles = float(raw_input("每年的飞行里程数是多少?"))
iceCream = float(raw_input("每年的冰淇淋消费量是多少?"))
datingDataMat, datingLabels = file2matrix('datingTestSet2.txt')
norMat, ranges, minVals = autoNorm(datingDataMat)
inArr = array([ffMiles, percentTats, iceCream])
classifierResult = classify0((inArr - minVals) / ranges, norMat, datingLabels, 3)
print "你可能会喜欢这个人 :", resultList[classifierResult - 1]

--------------------------
9、 kNN.py 准备数据:将图像转换为测试向量
--------------------------
# 准备数据:将图像转换为测试向量
def img2vector(filename):
returnVect = zeros((1, 1024))
fr = open(filename)
for i in range(32):
lineStr = fr.readline()
for j in range(32):
returnVect[0, 32 * i + j] = int(lineStr[j])
return returnVect

--------------------------
10、 kNN.py 测试算法:使用k-近邻算法识别手写数字
注意:本文需要使用 from os import listdir
数据digits.zip 存放在博客园的文件夹中,或者下载《机器学习实战》的源代码,里面有
--------------------------
#! /usr/bin/env python
# -*- coding: gbk -*- from numpy import *
import operator
from os import listdir # 测试算法:使用K-近邻算法识别手写数字
def handwritingClassTest():
hwLabels = []
trainingFileList = listdir('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('trainingDigits/%s' % fileNameStr) testFileList = listdir('testDigits')
errorCount = 0.0
mTest = len(testFileList)
for i in range(mTest):
fileNameStr = testFileList[i]
fileStr = fileNameStr.split('.')[0]
classNameStr = int(fileStr.split('_')[0])
vectorUnderTest = img2vector('testDigits/%s' % fileNameStr)
classifierResult = classify0(vectorUnderTest, trainingMat, hwLabels, 3)
print "\n分类器的回复是:%d,真正的答案是:%d" % (classifierResult, classNumStr) if (classifierResult != classNumStr):
errorCount += 1.0 print "\t 错误的总数是 : %d " % errorCount
print "\t 总误差率是 : %f" % (errorCount / float(mTest))

|
|
图片太长,其中截断了,读者可以自行测试看看效果
|
|

-------------------------------------------------------------------------------------------------
总结:以上就是机器学习实战的第二章的代码内容,没想到,三月份开始学习的内容,等到六月份才开始能够成功实现,主要是Numpy的安装,太狗了!
其间,学习安装Numpy与.whl类型的文件,会使用基本的matplotlib。k-近邻算法的模样还没有认清楚。接下来,进行决策树,过一段时间就可以
认识k-近邻算法了吧
【风马一族_Python】 实施kNN算法的更多相关文章
- 【风马一族_Python】 决策树
<机器学习实战>第三章 决策树 ------------------------------------- #1 trees.py 计算给定数据集的香农熵 ---------------- ...
- 【风马一族_Python】 安装pip与Numpy
------------------------------------------------------------------------------------------------- 原因 ...
- 【风马一族_Python】 更替pip的版本
替换电脑上python中的pip的版本 例子: 下载的文件:pip-8.1.1-py2.py3-none-any.whl 下载地址:https://pypi.python.org/pypi/pip/# ...
- 【风马一族_php】数组函数
原文来自:http://www.cnblogs.com/sows/p/6045699.html (博客园的)风马一族 侵犯版本,后果自负 2016-11-09 15:56:26 数组 函数 php- ...
- 【风马一族_php】NO5_php基础知识_数组
原文来自:http://www.cnblogs.com/sows/p/6032570.html (博客园的)风马一族 侵犯版本,后果自负 回顾 匿名函数 定义: 变量 = function [参数列表 ...
- 【风马一族_php】NO1_用php发出一声 Hi
原文来自:http://www.cnblogs.com/sows/p/5990157.html (博客园的)风马一族 侵犯版本,后果自负 第一步 安装WEB服务器 http://www.cnblog ...
- 【风马一族_php】NO0_搭建web服务器
原文来自:http://www.cnblogs.com/sows/p/5977996.html (博客园的)风马一族 侵犯版本,后果自负 安装apache apache是一种B/S结构的软件,apa ...
- 【风马一族_Android】通过菜单的点击,跳转到不同界面
---恢复内容开始--- 布局的代码:activity_main.xml <?xml version="1.0" encoding="utf-8"?> ...
- 【风马一族_xml】xmlp之dtd1
什么是XML约束? 在xml技术里,可以编写一个文档来约束一个xml文档的写法,这称之为xml约束 2. 为什么要使用xml约束? 参看提示栏 3. xml约束的作用? 约束xml的写法 对xml进行 ...
随机推荐
- Jquery 扩展方法
$.fn是指jquery的命名空间,加上fn上的方法及属性,会对jquery实例每一个有效. 如扩展$.fn.abc() 那么你可以这样子:$("#div").abc(); 通常使 ...
- spring + Quartz定时任务配置
<bean id="exportBatchFileTask" class="com.ydcn.pts.task.ExportBatchFileTask"& ...
- Sublime Text shift+ctrl妙用
1 :按住shift+ctrl然后按←或→可快速选中一行中的某一部分,相当于双击鼠标选中. 当你想在代码末尾加注释的话,这个方法很好用 输入文字->光标移到文字末尾->按住shift+ct ...
- Umbraco列表分页
展示型文章经常会遇到分页的问题,以下是我的解决方法: ; ; int.TryParse(Request.QueryString["page"], out page); var to ...
- Umbraco(5)-Creating Master Template Part 1(翻译文档)
原文地址:http://www.ncloud.hk/%E6%8A%80%E6%9C%AF%E5%88%86%E4%BA%AB/umbraco5-creating-master-template-par ...
- python连接字符串的方式
发现Python连接字符串又是用的不顺手,影响速度 1.数字对字符进行拼接 s="" #定义这个字符串,方便做连接 print type(s) for i in range(10 ...
- EntityFramework使用中的一些Bug
1. No Entity Framework provider found for the ADO.NET provider 解决方法:添加 EntityFramework.SqlServer.dl ...
- ASP.NET自定义错误页面
ASP.NET自定义错误页面 ASP.NET 提供三种用于在出现错误时捕获和响应错误的主要方法:Page_Error 事件.Application_Error 事件以及应用程序配置文件 (Web.co ...
- 微信小程序个人理解
1:小程序不是用HTML5开发,它是由微信全新定义的规范,是基于XML+JS的,不支持也不兼容HTML,兼容受限的部分CSS写法.(wxml) weixin markup language 2:小程序 ...
- 【网络收集】如何修改vs tfs的登录名和密码 .
连接TFS时,如果本机保存了用户的网络密码,不会出现用户名和密码的输入框,若要更换TFS的用户名和密码,需按以下步骤操作:控制面板--->用户账号--->管理网络密码,此时会列出所有保存了 ...