1、基本概念
k近邻法(k-nearest neighbor, k-NN)是1967年由Cover T和Hart P提出的一种基本分类与回归方法。它的工作原理是:存在一个样本数据集合,也称作为训练样本集,并且样本集中每个数据都存在标签,即我们知道样本集中每一个数据与所属分类的对应关系。输入没有标签的新数据后,将新的数据的每个特征与样本集中数据对应的特征进行比较,然后算法提取样本最相似数据(最近邻)的分类标签。一般来说,我们只选择样本数据集中前k个最相似的数据,这就是k-近邻算法中k的出处,通常k是不大于20的整数。最后,选择k个最相似数据中出现次数最多的分类,作为新数据的分类。
1.计算已知类别数据集中的点与当前点之间的距离;
2.按照距离递增次序排序;
3.选取与当前点距离最小的k个点;
4.确定前k个点所在类别的出现频率;
5.返回前k个点所出现频率最高的类别作为当前点的预测分类。
2、约会网站配对效果判定
海伦女士一直使用在线约会网站寻找适合自己的约会对象。尽管约会网站会推荐不同的任选,但她并不是喜欢每一个人。
经过一番总结,她发现自己交往过的人可以进行如下分类:
不喜欢的人
魅力一般的人
极具魅力的人
海伦收集的样本数据主要包含以下3种特征:(按照顺序)
1. 每年获得的飞行常客里程数
2. 玩视频游戏所消耗时间百分比
3. 每周消费的冰淇淋公升数
label:1代表不喜欢,2代表魅力一般,3代表极具魅力
导入模块
import numpy as np
import operator
import os
import pandas as pd
读入数据
# 这里采用最先进的读数据方式~比传统的处理方法好太多
def read_file(filename):
# '\t' 指按照空格切分
data = pd.read_csv(filename, header=None, sep='\t')
ret = pd.DataFrame(data)
feature_mat = ret.values[:, 0:3]
label_mat = ret.values[:, 3]
return feature_mat, label_mat
数据可视化
mydata, labels = read_file('datingTestSet2.txt')
fig = plt.figure()
ax = fig.add_subplot(1, 1, 1)
ax.scatter(mydata[:, 0], mydata[:, 1], 15.0*np.array(labels), 15.0*np.array(labels))
ax.set_xlabel('Frequent flyer miles earned each year')
ax.set_ylabel('Percentage of time spent playing video games')
plt.show()
# 可以明确看到两个特征之间的关系, 这时候我们完全可以排除别的特征!
我们对数据进行归一化 也可以按照需要增加权重
# 重点把握np.tile函数的使用
# 归一化之后再次可视化 验证是否正确
def normal_data(data_mat):
m = data_mat.shape[0]
max_value = data_mat.max(axis=0)
min_value = data_mat.min(axis=0)
ranges = max_value - min_value
data_mat = (data_mat - np.tile(min_value, (m, 1))) / np.tile(ranges, (m, 1))
return data_mat, ranges, min_value
模型建立结束-- 测试模型的性能
def class_dataset(test_data, train_data, train_label, k):
dataSetSize = len(train_data)
# 在列向量方向上重复inX共1次(横向),行向量方向上重复inX共dataSetSize次(纵向)
test_mat = np.tile(test_data, (dataSetSize, 1))
distance = ((test_mat - train_data) ** 2).sum(axis=1)
distance = distance ** 0.5
index_distance = distance.argsort()
class_dic = {
}
for i in range(k):
data_label = train_label[index_distance[i]]
class_dic[data_label] = class_dic.get(data_label, 0)