《机器学习实战》斧头书——第二章—KNN算法(1)——海伦的约会

《机器学习实战》斧头书——KNN

对文章的说明

对本文有几点说明如下:

  1. 我是一个刚学没多久的小白,所以代码可能也会有错误,欢迎各位大佬提出我的问题,感谢;
  2. 对于python版本 ,斧头书《机器学习实战》是用的2.x,本文使用的是3.x,然后代码的话,有的是参考书上的和网上的,还有部分是自己写的;
  3. 用的参考书是下面这本,封面拿了个斧头的人,这本书没有调库,都是用python写的底层代码,感觉对理解算法原理会更深入一点;

代码

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
yue = pd.read_table('datingTestSet.txt',names=['飞机里程数','玩游戏时间','吃冰淇淋量','魅力值'])
# 导入数据
Colors = [] #创建一个空的列表,存放颜色
for i in range(yue.shape[0]):
    a = yue.iloc[i,3]
    if a == 'didntLike':
        Colors.append('black')
    if a == 'smallDoses':
        Colors.append('blue')
    if a == 'largeDoses':
        Colors.append('red')
aaa=pd.DataFrame(Colors)
from matplotlib.font_manager import FontProperties #字体管理器
#设置汉字格式
font = FontProperties(fname=r"c:\windows\fonts\simsun.ttc", size=15)
fig = plt.figure(figsize=(12,10))
f1 = fig.add_subplot(221)
plt.scatter(yue.iloc[:,1],yue.iloc[:,0],alpha=0.6,marker='.',c=Colors)
plt.xlabel('玩游戏时间', fontproperties=font)
plt.ylabel('坐飞机时间', fontproperties=font)
f2 = fig.add_subplot(222)
plt.scatter(yue.iloc[:,2],yue.iloc[:,0],alpha=0.6,marker='.',c=Colors)
plt.xlabel('吃冰淇淋量', fontproperties=font)
plt.ylabel('坐飞机时间', fontproperties=font)
f3 = fig.add_subplot(223)
plt.scatter(yue.iloc[:,2],yue.iloc[:,1],alpha=0.6,marker='.',c=Colors)
plt.xlabel('吃冰淇淋量', fontproperties=font)
plt.ylabel('玩游戏时间', fontproperties=font)
plt.show()
for qq in range(3):# 0 1 2  双层循环 3个特征 轮流
    mmax = yue.iloc[:,qq].max()# 要先找出最大值和最小值  不然最后一行数据全是1  因为只剩自己了
    mmin = yue.iloc[:,qq].min()
    for q in range(yue.shape[0]):#针对每个特征的每一行的数据,从0——999
        yue.iloc[q,qq] = (yue.iloc[q,qq]-mmin)/(mmax-mmin) #归一化公式
X = yue.iloc[100:,:] #训练集 900 rows 
y = yue.iloc[0:100,:] #测试集 100 rows 
def l_knn(k,data,new): #自己封装一个函数,形参为k,已有的数据,需要判断类型的数据
    m = new.shape[0] #100
    n = data.shape[1]-1 #4-1=3
    result2 = []
    for i in range(m):
        distance = (((data.iloc[:,:n] - new.iloc[i,:n])**2).sum(1))**0.5 #sum(1)是横的相加,0是竖的相加
        #code和word分别与new做差,然后平方,求和,开根号,就是欧氏距离。
        distance_new = pd.DataFrame({'juli':distance,'meili':data.iloc[:,3]}) #用算好的距离那列替代原来的2列
        d2=distance_new.sort_values(by='juli')[:k] #根据juli距离这一列来排序
        result = d2.loc[:,'meili'].value_counts().index[0] #根据values的值来counts频率,排第一的就是结果啦
        result2.append(result)
    new2 = new.copy() #这里要复制一下再加一个新的列,不然会有警告
    new2['predict'] = result2
    print(new2) #看看结果  不过看不到多少
    accuracy = (new2.iloc[:,-1]==new2.iloc[:,-2]).mean() #求准确率
    print("KNN模型用于海伦约会对象预测的准确率是:",accuracy)
l_knn(5,X,y)

来看看结果吧,好像还好,准确率96%。

在这里插入图片描述

最后的表(部分)

在这里插入图片描述

3个特征的散点图

在这里插入图片描述
其实我感觉第三个特征——吃冰淇淋的量好像没什么影响,因为它的值全覆盖了,不是前2个的特征那样,在某个范围内的才是魅力值最大的。

总结

1、KNN算法比较简单,但是数据量多的话,运算一次要很久。这在下一篇文章中马上可以体现到。
2、改进的地方——可以将1-20的K用for循环都试一下,找出准确率最高的那个。
3、谢谢阅读,我是刚学不久的小白,有错误的话欢迎各位大佬提出来,共同进步,谢谢了。

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值