ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

机器学习实战:KNN

2020-01-26 19:44:27  阅读:289  来源: 互联网

标签:KNN 实战 机器 dataSet np import rowNum 数据


KNN—K近邻算法

工作原理

Training set中每个样本都存在标签(分类信息),输入的新数据没有标签。计算新数据与Training set中各个样本数据的距离,距离越近相似度越高。选择Training set中前k个最相似的数据(k通常不大于20),新数据的分类为k个最相似数据中出现次数最多的分类;若标签为数值型,则为k个最相似数据的平均值。

计算原理

欧式数据公式:\large d = \sqrt{(xA-xB)^{2} + (yA-yB)^{2}}

测试分类器

使用已知答案的数据,向分类器输入隐藏答案后的数据,计算错误率。

 

示例一:创建KNN分类器

1. 导入数据

def CreateDataset():
    group = np.array([[1,1.1],[1,1],[0,0],[0,0.1]])
    labels = ['A','A','B','B']
    return group,labels
group,labels = CreateDataset()

2. 实现KNN算法

import numpy as np
import collections

def KNN(inX,dataSet,label,k):
    rowNum = dataSet.shape[0]
    diffMat = np.tile(inX,(rowNum,1)) - dataSet
    sqMat = diffMat ** 2
    distMat = sqMat.sum(axis = 1)
    distance = distMat ** 0.5
    
    sortMat = distance.argsort()
    classCount = {}
    for i in range(k):
        l = labels[sortMat[i]]
        classCount[l] = classCount.get(l,0) + 1
    
    sort_result = sorted(classCount.items(),key = lambda x:x[1],reverse = True)
    return classCount
    

 

示例二:改进约会网站配对效果

样本特征

每年获得飞行常客里程数:数值分布为1000-90000

玩视频游戏所耗时间比:数值分布为0-14

每周消费的冰激凌公升数:数值分布为0-1

样本标签

不喜欢:1

魅力一般:2

极具魅力:3

(1)将文本记录转换为numpy矩阵

import numpy as np
import os

os.chdir('C://Users/lenovo/Desktop/MLiA_SourceCode/machinelearninginaction/')

def file2matrix(filename):
    file = open(filename)
    arrayLine = file.readlines()
    NumOfLine = len(arrayLine)
    returnMat = np.zeros((NumOfLine,3))
    labelVector = []
    index = 0
    for line in arrayLine:
        line = line.strip().split("\t")
        returnMat[index,:] = line[:3]
        labelVector.append(int(line[-1]))
        index += 1
    return returnMat,labelVector
datingDataMat,datingLabels = file2matrix("./Ch02/datingTestSet2.txt")

(2) 分析数据:使用Matplotlib 创建散点图

import matplotlib
import matplotlib.pyplot as plt
plt.scatter(datingDataMat[:,1],datingDataMat[:,2],s = 150*datingLabels,c = 15*np.array(datingLabels))
plt.show()

(3) 准备数据:归一化数值

三个特征的数值范围有很大区别,导致三个特征不是等权重的。需要对数值进行归一化,将原始数据转换为0到1区间的内的值。

\large newValue = (oldValue - min) / (max - min) 

def autoNorm(dataSet):
    maxFea = dataSet.max(axis = 0 )
    minFea = dataSet.min(axis = 0 )
    rangeFea = maxFea - minFea
    returnMat = (dataSet - np.tileminFea) / rangeFea
    return returnMat
autoNorm(datingDataMat)

(4) 测试算法

def datingclassTest():
    testRatio = 0.1
    rowNum = normMat.shape(0)
    numTestVec = testRatio * rowNum
    errorCount = 0

    for i in range(numTestVec):
        classifierResult = KNN(normMat[i,:],normMat[numTestVec:rowNum,:],datingLabels[numTestVec:rowNum,:],3)
        if (classifierResult != datingLabels[i]): errorCount += 1
    
    print ("The total error rate is %f %%" % (errorCount/numTestVec))

 

Keiji1102 发布了42 篇原创文章 · 获赞 3 · 访问量 3787 私信 关注

标签:KNN,实战,机器,dataSet,np,import,rowNum,数据
来源: https://blog.csdn.net/weixin_44649331/article/details/104063380

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有