KNN算法网上的给出的解释很多,源码也很多,有许多写的很好,所以这个仅作个人理解之用。
KNN算法简介:
KNN算法采用测量不同特征值之间的距离方法进行分类。
工作原理:
存在一个样本数据集,即训练数据集,并且样本集中每个样本数据都存在标签,即我们知道样本数据集中每一数据与所属分类的对应关系。输入没有标签的新数据后,将新数据的每个特征与样本集中数据对应的特征进行比较,然后算法提取样本集中特征最相似数据(最近邻)的分类标签。一般来说,只选择样本数据集中前K个最相似的数据,这就是KNN算法中的k的出处,通常K是不大于20的整数。最后,选择k个最相似的数据中出现次数最多的分类作为新数据的分类。
算法流程1:
收集数据:提供文本文件
准备数据:使用python解析文本文件
分析数据:使用matplotlib画二维图
处理数据:归一化特征值
测试算法:使用二丫提供的部分数据作为测试集
部署算法:产生简单的命令行程序,然后二丫可以输入一些特征数据以判断对方是否为自己喜欢的类型。
算法流程2:
计算待分类点与已知类别数据集中每个点的距离;
按照距离递增次序排序;
选取与待分类点距离最小的k个点;
确定前k个点类别出现的频率;
返回前k个点出现频率最高的类别作为当前点的预测分类
我们需要将txt中的数据可视化进行需求分析。
这边采用一个网上通用的数据集(来自《机器学习实战》):
这张图片展示的数据集的涵义是:
每行的第一列数据是飞行里程;
第二列是玩游戏所占百分比时间;
第三列是每年吃的冰激凌消耗量;
第四列是某个xx觉得这类人的适合约会的感兴趣程度。
也就是说啦,他一年飞40920公里,有百分之八左右的时间在玩游戏,每年还要吃掉0.9公升哦,这个对象xx觉得好有魅力,非常想和它约会呢,就是这个意思!
首先考虑第一个简单的问题,怎么把第四列的字符串转化成对应的数字:
直接使用if-else语句解决:
#将评价转化为数字
if listFromLine[3] == 'largeDoses':
listFromLine[3] =3
elif listFromLine[3] == 'smallDoses':
listFromLine[3]=2
else:
listFromLine[3]=1
经过转化之后,形式应该和右边那个一样了,非常想约会是3,一般是2,不想是1,就酱紫。这也就是类别了。
第二个问题在于说:怎么把从txt到存入array数组:
如何将txt数据清洗后存入到array也好,存入到database也好,这都是数据处理后续工作避不开的前提
下面上代码:
# -*- coding: utf-8 -*-
from numpy import *
import matplotlib.pyplot as plt
def file2matrix(filename):
fr = open(filename,'r')
arrayOlines = fr.readlines()
numberOfLines = len(arrayOlines)
returnMat = zeros((numberOfLines,3)) #构造全零阵来存放数
classLabelVector = [] #开辟容器
index = 0
for line in arrayOlines:
#清洗数据
line = line.strip()
listFromLine = line.split('\t')
#将评价转化为数字
if listFromLine[3] == 'largeDoses':
listFromLine[3] =3
elif listFromLine[3] == 'smallDoses':
listFromLine[3]=2
else:
listFromLine[3]=1
#存入数据到list
returnMat[index,:] = listFromLine[0:3] #三个特征分别存入一行的三个列
classLabelVector.append(int(listFromLine[3])) #最后一行是类别标签
index +=1
return returnMat,classLabelVector
#将喜欢强度转化为颜色
def ColorOfDatingLable(num):
datingLabels_rgb = []
for i in range(len(num)):
if num[i]==3:
datingLabels_rgb.append('red')
elif num[i]==2:
datingLabels_rgb.append('green')
else:
datingLabels_rgb.append('black')
return datingLabels_rgb
datingDataMat,datingLabels = file2matrix('D:\\PYthon-learning\\Python_test\\knn-test-2\\KNN\\datingTestSet.txt')
##################创建图表1#####################
plt.figure(1) #创建图表1
ax1 = plt.subplot(1,2,1)