# -*- 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. linux开机启动流程及需要开机启动服务讲解和修改及防火墙

    linux系统从开机到登陆的启动流程. 1.开机BIOS自检 2.MBR引导 3.grub引导菜单 4.加载内核kernel 5.启动init进程 6.读取inittab文件,执行rc.sysinit ...

  2. 华为/华三交换机snmp配置

    snmp-agent                       /使能snmp服务/snmp-agent local-engineid 000007DB7F000001000049DD   /系统自 ...

  3. OSI模型和TCP/IP协议族(三)

    TCP/IP协议族 TCP/IP协议族的开发要比OSI模型更早,因此TCP/IP协议族的分层结构无法准确地与OSI模型一一对应.原始的TCP/IP协议族定义为建立再硬件基础上的四个软件层,不通过目前T ...

  4. SparkHiveContext和直接Spark读取hdfs上文件然后再分析效果区别

    最近用spark在集群上验证一个算法的问题,数据量大概是一天P级的,使用hiveContext查询之后再调用算法进行读取效果很慢,大概需要二十多个小时,一个查询将近半个小时,代码大概如下: try: ...

  5. 谁能用通俗的语言解释一下什么是 RPC 框架?

    转载自知乎:https://www.zhihu.com/question/25536695 知乎上很多问题的答案还是很好的,R大就经常在上面回答问题 关于RPC你的题目是RPC框架,首先了解什么叫RP ...

  6. IPFS和竞争对手们(二)

    在上一篇<IPFS和竞争对手们(一)>的开头抱怨的IPFS的开发进度,今天才得知 MaidSafe 是从2006年起步的( )这进度也是醉了. 接上一篇,今天继续讲IPFS的竞争对手们 图 ...

  7. 简单使用git和github来管理代码----配置与使用

    在以前没听说过github之前,自己写的代码很容易丢或者遗失,等到用时才知码到用时方恨丢,现在用了github,真的是替自己生省不少的事,闲话不多说,上教程. 1 在github上注册账号 https ...

  8. poj 3620

    题意:给出一个矩阵,其中有些格子干燥.有些潮湿. 如果一个潮湿的格子的相邻的四个方向有格子也是潮湿的,那么它们就可以构成更大 的湖泊,求最大的湖泊. 也就是求出最大的连在一块儿的潮湿的格子的数目. # ...

  9. pat 抢红包

    L2-009. 抢红包 时间限制 300 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 没有人没抢过红包吧-- 这里给出N个人之间互相发红包.抢 ...

  10. 基于hi-nginx的web开发(python篇)——cookie和会话管理

    hi-nginx通过redis管理会话. 要开启管理,需要做三件事. 第一件开启userid: userid on; userid_name SESSIONID; userid_domain loca ...