机器学习实战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))

浙公网安备 33010602011771号