# -*- coding: utf-8 -*-
"""
Created on Wed Mar 7 09:17:17 2018


@author: admin
"""


#######################################################
#kNN cluster
#author:niucas
#date:2-18-03-07
#homePage:http://www.cnblogs.com/PiPifamily/
#email:maowankui@163.com
#命名规则采用驼峰命名
#######################################################
#导入对应的包
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
import operator


############
#准备数据
############
def creatDataSet():
'''
函数的作用是创建一个训练数据集,并且对应各个数据的label(标签)
'''
testData = np.array([
[1.0,1.1],
[1.0,1.1],
[0.,0.],
[0.,0.1]
])
testLabel = ['A','A','B','B']
return testData,testLabel
def classify(inData,dataSet,labels,k):
'''
此函数是用来进行分类;
参数定义如下:
inData:输入数据
dataSet:训练数据集
labels:训练数据对应的labels
k:选取的K值
'''
dataSetSize = dataSet.shape[0]
#第一步计算欧式距离
diff = np.tile(inData,(dataSetSize,1)) - dataSet #训练数据集每个对象与测试数据的差值
distance = ((diff**2).sum(axis=1)) ** 0.5#求差值的平方和
#############
#开始进行投票
#############
sortedDistIndex = np.argsort(distance) #将欧式距离进行升序排列,结果对应的是索引号
#存放最终结果的字典,初始化
classCount = {}
#投票就是计算前K个值中,概率的最大的类,哪个labels值最大
for i in range(k):
voteLabel = labels[sortedDistIndex[i]]
#print(voteLabel)
classCount[voteLabel] = classCount.get(voteLabel,0) + 1

#将classCount中的分类结果进行排序,返回得票数最高的label
sortedClassCount = sorted(classCount.items(),key=operator.itemgetter(1), reverse = True)#降序排列,默认是升序排列

# class = max(classCount.items(),Key = lambda x : x[1])[0]

return sortedClassCount[0][0]


if __name__ == "__main__":
#导入数据
dataSet,labels = creatDataSet()
inData = [0.1,0.1]
#简单分类
className = classify(inData,dataSet,labels,3)
print('the class of test sample is %s' % className)


#从文件中读取数据
def readFile(filepath):
'''
从文件中读取数据,并存储为矩阵形式
'''
#path = "E:\\1\ML\ML Data\machinelearninginaction\Ch02\datingTestSet.txt"
file = open(filepath)
dataSetLine = len(file.readlines()) #获取样本的行数
newDataMat = np.zeros((dataSetLine,3)) #初始化一个矩阵存放训练数据
newDataLabel = [] #创建一个list存放标签
index = 0

for line in file.readlines():
line = line.strip().split('\t')
#把分割好的数据放入数据集中,index是样本的下标
newDataMat[index,:] = line[0:3]
#把样本中的标签放到数据集中
newDataLabel = newDataLabel.append(int(line[-1]))
index += 1
return newDataMat,newDataLabel


#filepath = "E:\\1\ML\ML Data\machinelearninginaction\Ch02\datingTestSet.txt"
#Mat,Label = readFile(filepath)


def autoNormal(dataSet):
'''
数据集归一化处理
归一化是因为数据集中的‘每个月飞行里程数远大于其他的特征参数’,通过归一化
处理后可以将不同的特征数值转化为0-1之间的数值
'''
#step01:获取每一列的最小值和最大值
minValue = dataSet.min(0)
maxValue = dataSet.max(0)
#step02:最大值与最小值之间做差
diffValue = maxValue -minValue
#step03:新建一个等shape的矩阵,存放归一化后的数据
normalDataMat = np.zeros(dataSet.shape)
#step04:计算归一化后的矩阵
m = dataSet.shape[0]
normalDataMat = dataSet - np.tile(minValue,(m,1))
normalDataMat = normalDataMat/(np.tile(diffValue,(m,1)))

return normalDataMat,diffValue,minValue


def classTest():
'''
将原始数据的10%用作测试数据,其余90%用作训练数据
'''
testRatio = 0.10 #测试数据集比例10%
#导入数据归一化处理
path = "E:\\1\ML\ML Data\machinelearninginaction\Ch02\datingTestSet.txt"
testDataMat,testDataLabel = readFile(path)
norData,diffVal,minVal = autoNormal(testDataMat)
#确定测试集数目
m = norData.shape[0]#数据集的行数,代表数据大小
numTestDataset = int(m*testRatio)#测试数据集大小
#错误率
errorRatio = 0.0
#
print(norData)
#
for i in range(numTestDataset):
classifyResult = classify(norData[i,:],norData[numTestDataset:m,:],testDataLabel[numTestDataset,m],3)
print("分类器返回值:%d,真实的结果应该是:%d" % (classifyResult,testDataLabel[i]))
if (classifyResult != testDataLabel[i]):
errorRatio += 1.0
print(errorRatio)

classTest()




KNN算法的代码实现的更多相关文章

  1. 机器学习——KNN算法(k近邻算法)

    一 KNN算法 1. KNN算法简介 KNN(K-Nearest Neighbor)工作原理:存在一个样本数据集合,也称为训练样本集,并且样本集中每个数据都存在标签,即我们知道样本集中每一数据与所属分 ...

  2. 机器学习之KNN算法

    1 KNN算法 1.1 KNN算法简介 KNN(K-Nearest Neighbor)工作原理:存在一个样本数据集合,也称为训练样本集,并且样本集中每个数据都存在标签,即我们知道样本集中每一数据与所属 ...

  3. 运用kNN算法识别潜在续费商家

    背景与目标 Youzan 是一家SAAS公司,服务于数百万商家,帮助互联网时代的生意人私有化顾客资产.拓展互联网客群.提高经营效率.现在,该公司希望能够从商家的交易数据中,挖掘出有强烈续费倾向的商家, ...

  4. k-近邻算法python代码实现(非常全)

    1.k近邻算法是学习机器学习算法最为经典和简单的算法,它是机器学习算法入门最好的算法之一,可以非常好并且快速地理解机器学习的算法的框架与应用.它是一种经典简单的分类算法,当然也可以用来解决回归问题.2 ...

  5. 算法代码[置顶] 机器学习实战之KNN算法详解

    改章节笔者在深圳喝咖啡的时候突然想到的...之前就有想写几篇关于算法代码的文章,所以回家到以后就奋笔疾书的写出来发表了 前一段时间介绍了Kmeans聚类,而KNN这个算法刚好是聚类以后经常使用的匹配技 ...

  6. KNN算法java实现代码注释

    K近邻算法思想非常简单,总结起来就是根据某种距离度量检测未知数据与已知数据的距离,统计其中距离最近的k个已知数据的类别,以多数投票的形式确定未知数据的类别. 一直想自己实现knn的java实现,但限于 ...

  7. kNN算法基本原理与Python代码实践

    kNN是一种常见的监督学习方法.工作机制简单:给定测试样本,基于某种距离度量找出训练集中与其最靠近的k各训练样本,然后基于这k个“邻居”的信息来进行预测,通常,在分类任务中可使用“投票法”,即选择这k ...

  8. KNN算法原理(python代码实现)

    kNN(k-nearest neighbor algorithm)算法的核心思想是如果一个样本在特征空间中的k个最相邻的样本中的大多数属于某一个类别,则该样本也属于这个类别,并具有这个类别上样本的特性 ...

  9. 具体knn算法概念参考knn代码python实现

    具体knn算法概念参考knn代码python实现上面是参考<机器学习实战>的代码,和knn的思想 # _*_ encoding=utf8 _*_ import numpy as npimp ...

随机推荐

  1. To Fill or Not to Fill (贪心)

    转自:https://www.cnblogs.com/XBWer/p/3866486.html With highways available, driving a car from Hangzhou ...

  2. ssh框架中struts.xml 的配置参数详解

    <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "- ...

  3. 原生js移动端滑动事件

    移动端触屏滑动的效果其实就是图片轮播,在PC的页面上很好实现,绑定click和mouseover等事件来完成.但是在移动设备上,要实现这种轮播的效果,就需要用到核心的touch事件.处理touch事件 ...

  4. 如何彻底关闭windows defender

    我是一个喜欢裸奔的人,我不喜欢使用那些安全软件,什么360啊,什么毒霸啊让我深恶痛绝,就连windows自带的杀软我都不能忍啊,因为我平时喜欢找一下软件,很多的补丁和注册机,这些安全软件都会误报,所以 ...

  5. 利用CVE-2017-11882拿到持久性shell

    利用CVE-2017-11882拿到持久性shell 近日微软又爆出一个严重漏洞,利用该漏洞可以直接拿到目标机shell.这么好玩的东西怎么能错过了,于是搭建环境复现了一把. 首先去GitHub上下载 ...

  6. python 全栈开发,Day3

    python之集合,深浅copy 一.集合 集合是无序的,不重复的数据集合,它里面的元素是可哈希的(不可变类型),但是集合本身是不可哈希(所以集合做不了字典的键)的.以下是集合最重要的两点: 去重,把 ...

  7. 抓取Android应用的log

    今天测试软件时,遇到一个bug,因为开发说那边不复现,所以为了更好追踪这个问题,需要抓取复现步骤地log. 在网上查了相关资料,同时结合自己遇到的问题,总结如下. 1. 抓取Android 应用log ...

  8. Java大世界

    "java越来越过份了." php狠狠的说,他转头看着C:"C哥,您可是前辈,java最近砸了我不少场子,你老再不出来管管,我怕他眼里就没有您了啊." C哥吸烟 ...

  9. 搭建一套完整的Mysql5.7innodbcluster(GroupReplication+mysqlrouter)

    先说三个大步骤: 搭Mysql5.7 Group Replication ,配置成单主模式 安装Mysqlshell,配innodbcluster 安装Mysql-router 第一步:搭Mysql5 ...

  10. weka实际操作--构建分类、回归模型

    weka提供了几种处理数据的方式,其中分类和回归是平时用到最多的,也是非常容易理解的,分类就是在已有的数据基础上学习出一个分类函数或者构造出一个分类模型.这个函数或模型能够把数据集中地映射到某个给定的 ...