【机器学习 第一周】KNN-K邻近算法

梳理大纲: KNN算法
【1】了解kNN算法的思想及其原理
【2】使用Python手动实现kNN算法,并在sklearn中调用kNN算法
【3】了解监督学习和非监督学习的概念

参考资料:
机器学习 西瓜书
微信文章 From【木东居士】 公众号

From 机器学习 小组:由【木东居士】公众号 定期发起
对数据感兴趣的伙伴们 可一同在此交流学习

KNN算法的思想及原理

KNN算法,又称“K-近邻算法”

【简要解释】
1.已知:样本集中每一个数据与所属分类的对应关系
2.操作:输入新样本(不带标签),将其特征与各个样本对应的特征进行比较
3.算法:提取样本最相似的K个数据,以它们的分类标签 对新数据的分类进行预测

以下图进行解释:
当K取1时(只以最近的那个伙伴作为参考):判别是 +
当K取3时(以周围最近的3个伙伴作为参考):判别是 -
当K取5时(以周围最近的5个伙伴作为参考):判别是 +
在这里插入图片描述

KNN模型:三大基本要素:
【1】距离度量:反映两样本间的相似程度
一般使用 “欧氏距离” 进行计算
【2】K值:选取周围的K个小伙伴作为“邻居”
建议使用 “交叉检验” 进行验证
【3】决策规则
分类问题常使用 “投票法” ;回归问题常使用 “平均法”

“K-近邻”属于“懒惰学习”算法:
—— 因为在训练阶段它仅仅是将数据保存起来,训练时间开销为零,待收到测试样本后再进行处理
对比 “急切学习”算法:
—— 在训练阶段就对样本进行学习处理

———————————————————————————————————

Python手动实现KNN算法 & Sklearn调用KNN算法

  • Python手动实现
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)
  • Sklearn调用
# 读取相应的库
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)))

补充:如何选择合适的K值大小?——交叉验证

交叉验证 玩法:
将训练数据集 进一步分成 训练数据验证数据
这小部分样本的预报误差,记录它们的平方加和

例如 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)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值