数据挖掘十大算法(一):k-近邻算法

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) 
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值