赞
踩
梳理大纲: KNN算法
【1】了解kNN算法的思想及其原理
【2】使用Python手动实现kNN算法,并在sklearn中调用kNN算法
【3】了解监督学习和非监督学习的概念参考资料:
机器学习 西瓜书
微信文章 From【木东居士】 公众号From 机器学习 小组:由【木东居士】公众号 定期发起
对数据感兴趣的伙伴们 可一同在此交流学习
KNN算法,又称“K-近邻算法”
【简要解释】
1.已知:样本集中每一个数据与所属分类的对应关系
2.操作:输入新样本(不带标签),将其特征与各个样本对应的特征进行比较
3.算法:提取样本最相似的K个数据,以它们的分类标签 对新数据的分类进行预测
以下图进行解释:
当K取1时(只以最近的那个伙伴作为参考):判别是 +
当K取3时(以周围最近的3个伙伴作为参考):判别是 -
当K取5时(以周围最近的5个伙伴作为参考):判别是 +
KNN模型:三大基本要素:
【1】距离度量:反映两样本间的相似程度
一般使用 “欧氏距离” 进行计算
【2】K值:选取周围的K个小伙伴作为“邻居”
建议使用 “交叉检验” 进行验证
【3】决策规则
分类问题常使用 “投票法” ;回归问题常使用 “平均法”
“K-近邻”属于“懒惰学习”算法:
—— 因为在训练阶段它仅仅是将数据保存起来,训练时间开销为零,待收到测试样本后再进行处理
对比 “急切学习”算法:
—— 在训练阶段就对样本进行学习处理
———————————————————————————————————
from collections import Counter from math import sqrt import numpy as np from sklearn import datasets from sklearn.model_selection import train_test_split # 导入数据(选择鸢尾花数据集),并且切分训练集与检验集 iris = datasets.load_iris() X = iris.data y = iris.target X_train,X_test,y_train,y_test = train_test_split(X,y) def knn_classify(X,y,test_X,K): """ 输入训练集(X,y)以及K值 根据给到的一个test_X返回分类预测值 """ distance_list = [count_distance(i,test_X) for i in X] k_distance = np.argsort(distance_list)[:K] count_dict = Counter(y[k_distance]) return count_dict.most_common()[0][0] # 此处函数并不完善,仅对有唯一最大值的情况生效(最大值不唯一时,需要再做优化) def count_distance(x,y): """ 计算两点之间的距离 """ distance = sqrt(sum((x-y)**2)) return distance predict_list = [ knn_classify(X_train,y_train,tx,5) for tx in X_test ] correct_num = sum((predict_list==y_test)==True) accuracy_score = correct_num / len(y_test) print("准确度为%.2f"%accuracy_score)
# 读取相应的库 import numpy as np from sklearn import datasets from sklearn.model_selection import train_test_split from sklearn.neighbors import KNeighborsClassifier # 读取数据 X, y iris = datasets.load_iris() X = iris.data y = iris.target # 把数据分成训练数据和测试数据 X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=20) # 构建KNN模型, K值为3、 并做训练 clf = KNeighborsClassifier(n_neighbors=3) clf.fit(X_train, y_train) # 计算准确率 from sklearn.metrics import accuracy_score correct = sum((clf.predict(X_test)==y_test)==True) print ("Accuracy is: %.3f" %(correct/len(X_test))) # 或者accuracy_score(y_test, clf.predict(X_test)) # print ("Accuracy is: %.3f" %(accuracy_score)))
交叉验证 玩法:
将训练数据集 进一步分成 训练数据 和 验证数据
这小部分样本的预报误差,记录它们的平方加和
例如 10折交叉验证(10-fold cross validation):
将数据集分成十份,轮流将其中9份做训练1份做验证,10次的结果的均值作为对算法精度的估计
———————————————————————————————————
监督学习:
有基础的训练数据 进行学习训练
再将需要预测的数据进行输入,得到预测的结果(不管是连续的还是离散的)
常见方法:
决策树(Decision Tree,DT)
朴素贝叶斯分类器(Naive Bayesian Model,NBM)
最小二乘法(Least squares)
逻辑回归(Logistic Regression)
支持向量机(SVM)
K最近邻算法(KNN,K-NearestNeighbor)
…
无监督学习:
不对数据进行标明,让机器自动去判断,哪些数据比较类似,归到一类等等
常见方法:
聚类算法
K-均值算法(K-Means)
主成分分析(Principal Component Analysis,PCA)
SVD矩阵分解(Singular Value Decomposition)
…
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。