机器学习实战:KNN

KNN—K近邻算法

工作原理

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

计算原理

欧式数据公式:机器学习实战:KNN

测试分类器

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

 

示例一:创建KNN分类器机器学习实战: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()

机器学习实战:KNN

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

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

机器学习实战:KNN 

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))

 

机器学习实战:KNN机器学习实战:KNN Keiji1102 发布了42 篇原创文章 · 获赞 3 · 访问量 3787 私信 关注
上一篇:Oracle分页


下一篇:Oracle获取每分钟、每10分钟、每小时、每天、每周、每月、每年的时间或日期