进击的机器学习 Fourth Day——K最近邻算法(K-Nearest Neighbors)

从今天开始学习K最近邻算法(K-Nearest Neighbors),简称KNN算法。KNN算法的原理也很简单,用一句话来说就是"近朱者赤,近墨者黑"。首先来说,KNN算法属于监督学习模型中的分类算法(但是KNN也可以用于回归分析),原理简单易懂,算法容易理解,实在是居家必备,装逼秀操作的好算法。

原理介绍:
球球最乖
那么问题来了,如何判断球球的的类别呢?很多同学可能都想得到,它离谁比较近,就归哪一类呗。其实这就是KNN算法的基本原理:如果要判断球球属于哪一类别,首先计算球球和所有数据的距离(可以理解成相似度,距离用的是闵可夫斯基距离),然后筛选出距离最近的五个(这个可以根据数据的类型自行选择)数据,把类别出现频率最高的那个赋给球球,作为其类别。所以KNN算法可以用在很多分类领域发挥它的用途,比如说手写体数字的识别,花的种类识别啊等等。但是呢,KNN算法很勤快,它一般不会保存训练模型,每一次都是现场运算。其次KNN算法不适合不均衡的数据集,主要原因就好比说男生只有一个,女生有十个,问另一个不知性别的小朋友的性别,这时候明显即使是位男生,也无力反驳自己不是女生了。最重要的是KNN算法的计算量很大,对于较大的数据集也是不合适的,所以通常进行数据归一化是必须的!以上是对KNN算法的简要介绍。
上面给出的就是KNN模型的原理,可以说是最简单的算法了。下面我们就来具体实战了。首先老样子,从Sklearn,Tensorflow和自行搭建三个角度完成KNN算法。数据集下载提取码 qt2a
我要开始表演
数据集的样子

      User ID  Gender  Age  EstimatedSalary  Purchased
0    15624510    Male   19            19000          0
1    15810944    Male   35            20000          0
2    15668575  Female   26            43000          0
3    15603246  Female   27            57000          0
4    15804002    Male   19            76000          0
..        ...     ...  ...              ...        ...
395  15691863  Female   46            41000          1
396  15706071    Male   51            23000          1
397  15654296  Female   50            20000          1
398  15755018    Male   36            33000          0
399  15594041  Female   49            36000          1

[400 rows x 5 columns]
#数据表示的是性别,年龄和工资状况对是否购买某一产品的影响
1、Sklearn的KNN模型
from sklearn.model_selection import train_test_split#导入数据集拆分
from sklearn.preprocessing import StandardScaler as SS#导入归一化
import pandas as pd
from sklearn.neighbors import KNeighborsClassifier as nn#导入KNN模型
from sklearn.preprocessing import LabelEncoder as LE#导入编码字符
from sklearn.preprocessing import OneHotEncoder as OE#导入OneHot编码
from sklearn.metrics import confusion_matrix#导入混淆矩阵
dataset=pd.read_csv(path)
x=dataset.iloc[:,1:4].values
y=dataset.iloc[:,4].values
le=LE().fit(x[:,0])
x[:,0]=le.fit_transform(x[:,0])#对男女性别进行编码
#oe=OE(categorical_features=[0])
#x=oe.fit_transform(x).toarray()
ss=SS()
x=ss.fit_transform(x)#数据归一化处理
x_train,x_test,y_train,y_test=train_test_split(x,y,test_size=0.2,random_state=0)#拆分数据集
knn=nn(n_neighbors=5,n_jobs=-1,weights='distance')#设定KNN模型参数,第一个表示选取的范围,第二个表示调用cpu的数量,第三个是对距离进行加权,距离越大得分越小
knn.fit(x_train,y_train)
y_pre=knn.predict(x_test)#进行预测
confusion=confusion_matrix(y_test,y_pre)#用混淆矩阵表示精确度
print(confusion)#正对角线表示判断正确数量,负对角线表示错误数量
以上就是对KNN模型的Sklearn的实现。下面就是自己动手操作写一写KNN模型
2、Numpy的KNN模型
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler as SS
import pandas as pd
from sklearn.preprocessing import LabelEncoder as LE
from sklearn.metrics import confusion_matrix
import operator
dataset=pd.read_csv(path)
x=dataset.iloc[:,1:4].values
y=dataset.iloc[:,4].values
le=LE().fit(x[:,0])
x[:,0]=le.fit_transform(x[:,0])
ss=SS()
x=ss.fit_transform(x)
x_train,x_test,y_train,y_test=train_test_split(x,y,test_size=0.2,random_state=0)
#以上步骤是对数据进行预处理
def knn(x_test,x,y):
    shape=x.shape#获取训练集x的形状
    X=np.tile(x_test,(shape[0],1))#将测试单元扩展为和训练集一样的形状,x_test为一行向量特征,注意理解为什么只取形状中的第一维
    sq=np.square(x-X)
    distance=np.sum(sq,axis=1)#以上是计算距离
    rank=np.argsort(distance)#将距离进行排序,排列的内容就是索引
    index=[y[rank[0]],y[rank[1]],y[rank[2]],y[rank[3]],y[rank[4]]]#获取前五个最小的索引
    index_set=set(index)#将列表转换为集合,目的是去除重复值
    zeros=[]
    for i in range(len(index_set)):
        zeros.append(0)#生成0列表
    index_dict=dict(zip(index_set,zeros))#合并为字典
    for i in index:
        index_dict[i]+=1#计算类别出现的数目
    result=sorted(index_dict.items(),key=operator.itemgetter(1),reverse=True)#对类别出现数量的大小作排序,注意对sorted()函数的使用和operator库中关键词索引,可以理解为字典的排序方法
    return result[0][0]#返回出现最多的类别

以上部分便是所有KNN算法的实现,我太菜了,呜呜,TensorFlow还实现不了,所以就只写了这些。但是KNN算法确实太简单了,用TensorFlow反而大材小用了(极力为自己辩护),但是确实是自己实力还不够,我还得要变强。

我也想这样飞
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,185评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,445评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,684评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,564评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,681评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,874评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,025评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,761评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,217评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,545评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,694评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,351评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,988评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,778评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,007评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,427评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,580评论 2 349

推荐阅读更多精彩内容