机器学习(KNN算法)
来源:互联网 发布:瞩目软件 编辑:程序博客网 时间:2024/05/04 12:26
1.KNN工作原理
简单地说,谷近邻算法采用测量不同特征值之间的距离方法进行分类。
存在一个样本数据集合,也称作训练样本集,并且样本集中每个数据都存在标签,即我们知道样本集中每一数据与所属分类的对应关系。输人没有标签的新数据后,将新数据的每个特征与样本集中数据对应的特征进行比较,然后算法提取样本集中特征最相似数据(最近 邻)的分类标签。一般来说,我们只选择样本数据集中前k个最相似的数据,这就是k-近邻算法中k的出处,通常k是不大于20的整数。最 后 ,选择k个最相似数据中出现次数最多的分类,作为新数据的分类。
2.KNN算法
机器学习实战书内的示例KNN算法python代码如下:
def classify0(inX,dataSet,labels,k): #得到训练样本的行数 dataSetSize = dataSet.shape[0] diffMat = tile(inX, (dataSetSize,1))-dataSet sqDiffMat = diffMat**2 #将行相加则 sqDistances = sqDiffMat.sum(axis=1) distances = sqDistances**0.5 #从小到大排序返回索引 sortedDistIndicies = distances.argsort() #统计每个类的次数 classCount ={} for i in range(k): label = labels[sortedDistIndicies[i]] #get函数获取键,若没有该键则默认值为0,原型为dict.get(key,default = None) classCount[label] = classCount.get(label,0)+1 #对字典按键和值进行排序,reverse默认为false,则从小到大排序,operator.itemgetter(1)按值进行排序 sortedclassCount = sorted(classCount.iteritems(),key = operator.itemgetter(1),reverse = True) return sortedclassCount[0][0]
diffMat = tile(inX, (dataSetSize,1))-dataSet中tile函数用法如下:
函数格式tile(A,reps)
A:输入的array B:A沿各个维度重复的次数
reps的数字从后往前分别对应A的第N个维度的重复次数。
如tile(A,2)表示A的第一个维度重复2遍
>>> tile(1,2)array([1, 1])
tile(A,(2,3))表示A的第一个维度重复3遍,然后第二个维度重复2遍>>> b=[1,3,5]>>> tile(b,[2,3])array([[1, 3, 5, 1, 3, 5, 1, 3, 5], [1, 3, 5, 1, 3, 5, 1, 3, 5]])
sqDistances = sqDiffMat.sum(axis=1)中sum函数用法如下:
.sum()函数是模块numpy的一个函数,参数axis默认为None,表示将所有元素的值相加, axis=1表示按行相加 , axis=0表示按列相加
>>> import numpy as np>>> a=np.sum([[0,1,2],[2,1,3]])>>> a9>>> a.shape()>>> a=np.sum([[0,1,2],[2,1,3]],axis=0)>>> aarray([2, 2, 5])>>> a.shape(3,)>>> a=np.sum([[0,1,2],[2,1,3]],axis=1)>>> aarray([3, 6])>>> a.shape(2,)
classCount[label] = classCount.get(label,0)+1中get()函数用法如下:
函数原型dict.get(key, default=None)
key -- 字典中要查找的键。default -- 如果指定键的值不存在时,返回该默认值值。
返回指定键的值,如果值不在字典中返回默认值None。
实例:
#!/usr/bin/pythondict = {'Name': 'Zara', 'Age': 27}print "Value : %s" % dict.get('Age')print "Value : %s" % dict.get('Sex', "Never")
以上实例输出结果为:
Value : 27Value : Never
3.scikit-learn实现KNN算法
读取Iris数据集细节资料代码如下:
>>>#从sklearn.datasets 导入 iris 数据加载器>>>from sklearn.datasets import load_iris>>>#使用加载器读取数据并且存入变量iris。>>>iris = load_iris()>>>#查验数据规模>>>iris.data.shape>>>(150L,4L)>>>#从sklearn.cross_validation 里选择导入 train_test_split 用于数据分割>>>from sklearn.cross_validation import train_test_split>>>#利用随机种子random_state 采样25%的数据作为测试数据>>>X_train,X_test,y_train,y_test = train_test_split(iris.data,iris.target,test_size = 0.25,random_state = 33)
使用K近邻分类器对数据进行类别预测代码如下:
>>>#从sklearn.preprocessing 里选择导入数据标准化模块>>>from sklearn.preprocessing import StandardScaler>>>#从sklearn.neighbors 里选择导入KNeighborsClassifier>>>from sklearn.neighbors import KNeighborsClassifier>>>#对训练和测试的特征数据进行标准化>>>ss = StandardScaler()>>>X_train = ss.fit_transform(X_train)>>>X_test = ss.transform(X_test)>>>#使用K近邻分类器对测试数据进行预测,预测结果保存在变量y_predict中>>>knc = KNeighborsClassifier()>>>knc.fit(X_train,y_train)>>>y_predict = knc.predict(X_test)
对K近邻分类器在数据上的预测性能进行评估代码如下:
>>>#使用模型自带的评估函数进行准确性测评>>>print 'The accuracy of K-Nearest Neighbor Classifier is',knc.score(X_test,y_test)>>>The accuracy of K-Nearest Neighbor Classifier is 0.894796455>>>#依然使用sklearn.metrics里面的classification_report模块>>>from sklearn.metrics import classification_report>>>print classification_report(y_test,y_predict,target_names = iris.target_names)
总结:
K近邻算法与其他模型最大的不同在于:该模型没有参数训练过程。也就是说,我们并没有通过任何学习算法分析训练,而只是根据测试样本在训练数据的分布直接做出分类决策。
该模型每处理一个测试样本,都需要对所有预先加载在内存的训练样本进行遍历、逐一计算相似度、排序并且选取K个最近邻训练样本的标记,进而做出分类决策。这是平方级别的计算复杂度,一旦数据规模稍大,使用者便需要权衡更多计算时间的代价。
阅读全文
2 0
- 机器学习(KNN算法)
- 《机器学习》 KNN算法
- 机器学习:KNN算法
- 机器学习-KNN 算法
- 【机器学习】kNN算法
- 机器学习 -- kNN算法
- 机器学习---kNN算法
- 机器学习--kNN算法
- 机器学习--KNN算法
- 机器学习算法-kNN
- 机器学习knn算法
- 机器学习算法(四):KNN算法
- 白话机器学习算法(二)KNN
- 【机器学习】k近邻算法(kNN)
- 白话机器学习算法(二)KNN
- 机器学习算法(1)-KNN
- 机器学习(一):KNN算法
- 《机器学习实战》(一)knn算法
- 2017年上海金马五校程序设计竞赛:Problem B : Sailing
- Centos7 安装redis 和 phpredis扩展
- java 通过发送json,post请求,返回json数据
- 案例—IP拨号器
- linux下tar.gz、tar、bz2、zip等解压缩、压缩命令小结
- 机器学习(KNN算法)
- Spring 装配Bean 基于注解
- web自定义滚动条
- 21_for语句
- 路由表条目生成算法
- 对servlet九大内置对象的介绍及部分对象的区别
- JDBC连接
- 微信公众号获取不到access_token问题
- 驱动学习4--led静态映射