作者:張張張張
github地址:https://github.com/zhanghekai
【转载请注明出处,谢谢!】
【机器学习系列】之k近邻(kNN)
【机器学习系列之】纯python及sklearn实现kNN
一、纯python实现kNN Brute-Force法
kNN项目案例:优化约会网站的配对效果
项目概述
拉克丝使用约会网站寻找约会对象,经过一段时间之后,她发现曾交往过三种类型的人:
- 不喜欢的人
- 魅力一般的人
- 极具魅力的人
她希望:
- 工作日与魅力一般的人约会
- 周末与极具魅力的人约会
- 不喜欢的人则直接排除掉
现在她收集到了一些约会网站未曾记录的数据信息,这更有助于匹配对象的归类。拉克丝约会的对象主要包含以下3种特征:
- 每年获得的飞行常客里程数
- 玩视频游戏所耗时间百分比
- 每周消费的冰淇淋公升数
文本文件数据格式如下,完整数据集可在我的github中找到。
40920 8.326976 0.953952 3 14488 7.153469 1.673904 2 26052 1.441871 0.805124 1 75136 13.147394      0.428964 1 38344 1.669788 0.134296 1 40920 \qquad8.326976\qquad 0.953952\qquad 3\\ 14488\qquad 7.153469\qquad 1.673904\qquad 2\\ 26052\qquad 1.441871\qquad 0.805124\qquad 1\\ 75136\qquad 13.147394\quad\;\; 0.428964\qquad 1\\ 38344\qquad 1.669788\qquad 0.134296\qquad 1 409208.3269760.9539523144887.1534691.6739042260521.4418710.80512417513613.1473940.4289641383441.6697880.1342961
导入需要用到的包
import numpy as np
import matplotlib.pyplot as plt
import operator
from os import listdir
from collections import Counter
数据处理:将文本记录转换为 NumPy 的解析程序
\quad 输入: 数据文件路径
\quad 输出: 数据矩阵 returnMat 和对应的类别 classLabelVector
def file2matrix(filename):
fr = open(filename)
# 获得文件中的数据行的行数
numberOfLines = len(fr.readlines())
# 生成对应的空矩阵
# 例如:zeros(2,3)就是生成一个 2*3的矩阵,各个位置上全是 0
returnMat = np.zeros((numberOfLines, 3))
classLabelVector = []
fr = open(filename)
index = 0
for line in fr.readlines():
line = line.strip()
# 以 '\t' 切割字符串
listFromLine = line.split('\t')
# 每列的属性数据
returnMat[index, :] = listFromLine[0:3]
# 每列的类别数据,就是 label 标签数据
classLabelVector.append(int(listFromLine[-1]))
index += 1
# 返回数据矩阵returnMat和对应的类别classLabelVector
return returnMat, classLabelVector
将数据归一化
归一化是一个让权重变为统一的过程,归一化特征值,消除特征之间量级不同导致的影响。
归一化定义: 我们是这样认为的,归一化就是要把你需要处理的数据经过处理后(通过某种算法)限制在你需要的一定范围内。首先归一化是为了后面数据处理的方便,其次是保正程序运行时收敛加快。
归一化的几种方法
1.线性函数转换:
y = x − M i n V a l u e M a x V a l u e − M i n V a l u e y=\frac{x-MinValue}{MaxValue-MinValue} y=