机器学习实战KNN

机器学习实战KNN

标签(空格分隔): 机器学习,学习笔记


k-近邻算法是根据向量之间的欧式距离来进行分类的算法,例如:

特征A       特征B       特征C       lable
2           3           4           美女
100         200         300         帅哥

则对于一个向量(6,8,10),因为((6-2)**2+(8-3)**2+(10-4)**2)**0.5要更小,所以我们把向量(6,8,10)归类为‘美女’

在代码实现过程中,需要进行归类的变量往往需要和一堆已知向量求取欧式距离,我们可以选择距离最小的前几个,比如5个,然后在这五个中进行投票,如果帅哥的个数大于美女,则我们将其归类为帅哥,反之亦然。

import numpy as np
#vect 输入向量
#feature 已知向量
#lable 已知向量标签
#k 选择距离最小的前k个
def knn(vect,feature,lable,k):
    feature_len=feature.shape(0) #行数
    vect=np.tile(vect,(feature_len,1)) #拓展
    div=(feature-vect)**2
    div2=div.sum(axis=1)
    div2=div2**0.5
    rangeindex=np.argsort(div2) #获取从小到大排序数据的索引,如果从大到小,则改为-div2
    classlab={}
    for i in range(k):
        index=lable[rangeindex[i]]
        classlab[index]=classlab.get(index,0)+1 #如果没有,返回0
        f=sorted(classlab.items(),key = lambda x:x[1],reverse = True) #排序,返回从大到小的 key 值
    return f[0][0]

例如利用上述算法对机器学习实战这本书的一个例子进行数据分类
数据如下,前三列是feature,最后一列是lable:

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
72993	10.141740	1.032955	1
35948	6.830792	1.213192	3
.........................

1.文件预处理

import numpy as np
def file_previous(filepath):
    txt=open(filepath)
    number=len(txt.readlines())
    feature=np.zeros((number,3))
    lable=[]
    index=0
    txt = open(filepath)#难以理解,如果没有再次打开文件,返回的结果有问题
    for line in txt:
        line=line.strip().split('\t')
        feature[index,:]=line[0:3]
        lable.append(line[-1])
        index+=1
    return feature,lable

2.数据归一化

import numpy as np
def feature2normal(feature):
    feature_max=feature.max(0)
    feature_min=feature.min(0)
    #print(feature_max)
    feature_max = np.tile(feature_max, (feature.shape(0), 1))
    feature_min=np.tile(feature_min,(feature.shape(0),1))
    normal=(feature-feature_min)/(feature_max-feature_min)
    return normal

3.分类算法

import numpy as np
#vect 输入向量
#feature 已知向量
#lable 已知向量标签
#k 选择距离最小的前k个
def knn(vect,feature,lable,k):
    feature_len=feature.shape(0) #行数
    vect=np.tile(vect,(feature_len,1)) #拓展
    div=(feature-vect)**2
    div2=div.sum(axis=1)
    div2=div2**0.5
    rangeindex=np.argsort(div2) #获取从小到大排序数据的索引,如果从大到小,则改为-div2
    classlab={}
    for i in range(k):
        index=lable[rangeindex[i]]
        classlab[index]=classlab.get(index,0)+1 #如果没有,返回0
        f=sorted(classlab.items(),key = lambda x:x[1],reverse = True) #排序,返回从大到小的 key 值
    return f[0][0]

4.对程序进行测试

def test(filepath):
    f=0.1 #选取0.1数据进行测试
    feature,lable=file_previous(filepath):
    normal=feature2normal(feature)
    m=mormal.shape(0)
    number=f*normal.shape(0)
    errcount=0
    for i in range(number):
        class1=knn(normal[i,:],normal[number:m,:],lable[number:m],5)
      print('the prediction is {0},the real is {1}'.format(calss1,lable[i]))
      if class1 != lable[i]:
          errcount+=1
    print('错误率为{0}'.format(errcount/number))
posted @ 2019-07-16 16:24  夜空守望者Z  阅读(205)  评论(0)    收藏  举报