Python3入门机器学习 - k近邻算法
邻近算法,或者说K最近邻(kNN,k-NearestNeighbor)分类算法是数据挖掘分类技术中最简单的方法之一。所谓K最近邻,就是k个最近的邻居的意思,说的是每个样本都可以用它最接近的k个邻居来代表。
kNN算法的核心思想是如果一个样本在特征空间中的k个最相邻的样本中的大多数属于某一个类别,则该样本也属于这个类别,并具有这个类别上样本的特性。
数据预备,这里使用random函数生成10*2的矩阵作为两列特征值,1个10个元素数组作为类别值
import numpy as npimport matplotlib.pyplot as plt x_train = np.random.rand(10,2)*8y_train = np.random.randint(0,2,10)
x = np.array([3,4])
k=3plt.scatter(x_train[y_train==1,0],x_train[y_train==1,1],color="red")
plt.scatter(x_train[y_train==0,0],x_train[y_train==0,1],color="green")
plt.scatter(x[0],x[1],marker='+',color="blue")
plt.show()

绿点为类别0,红点为类别1
X_train = np.array(x_train) Y_train = np.array(y_train) from math import sqrtdistances = []for x_train in X_train:
d = sqrt(np.sum((x-x_train)**2))
distances.append(d) distances = [sqrt(np.sum((x-x_train)**2)) for x_train in X_train]
argindex = np.argsort(distances) from collections import Counter topK_Y = [Y_train[i] for i in argindex[:k]] votes = Counter(topK_Y)
votes.most_common(1)[0][0]
执行结果为判断x点大概率为类别0(绿点)
使用sklearn中封装的knn算法
from sklearn.neighbors import KNeighborsClassifier knn_clf = KNeighborsClassifier(n_neighbors=3) knn_clf.fit(X_train,Y_train) knn_clf.predict(x.reshape(1,-1))[0]
封装自己的knn算法
# _*_ encoding:utf-8 _*_import numpy as np
from math import sqrt
from collections import Counterclass KNNClassifier:
def __init__(self,k):
assert k>=1, "k must be valid"
self.k = k self._X_train = None self._Y_train = None def fit(self,X_train,Y_train):
assert X_train.shape[0] == Y_train.shape[0],\ "The size of X_train must be equals to the size of Y-Train"
assert self.k <= X_train.shape[0] self._X_train = X_train self._Y_train = Y_train return self def predict(self,x_predict): return np.array([self._predict(x) for x in x_predict]) def _predict(self,x):
distances = [ sqrt(np.sum((x_train-x)**2)) for x_train in self._X_train]
nearest = np.argsort(distances)
votes = [i for i in self._Y_train[nearest[:self.k]]] return Counter(votes).most_common(1)[0][0] def __repr__(self): return "knn(k=%d)" %self.k
测试与训练数据集分类
为了能够确认模型的准确性,我们需要将已有数据集按一定比例分类为测试数据集和训练数据集
# _*_ encoding:utf-8 _*_import numpy as npdef train_test_split(X,y,test_radio=0.2,seed=None):
assert X.shape[0]==y.shape[0],"The size of X and y must be equal"
assert 0.0<=test_radio<=1.0,"test radio must be valid"
if(seed):
np.random.seed(seed) shuffled_indexes = np.random.permutation(len(X))
test_size = int(X.shape[0]*test_radio)
test_indexes = shuffled_indexes[:test_size]
train_indexes = shuffled_indexes[test_size:] X_test = X[test_indexes]
y_test = y[test_indexes]
X_train = X[train_indexes]
y_train = y[train_indexes] return X_train,X_test,y_train,y_test
使用knn算法测试数据集digits
import numpy as npfrom sklearn import datasetsimport matplotlib.pyplot as pltimport matplotlib
%run MyScripts/KNN.py
%run MyScripts/metrics.py
%run MyScripts/model_selection.py digits = datasets.load_digits()
X = digits.data
y = digits.target
some_digit = X[666]
some_digit_image = some_digit.reshape(8,8)
plt.imshow(some_digit_image,cmap=matplotlib.cm.binary)

画出第666个数据对应的数字图片
knn_clf = KNNClassifier(k=6)
X_train,X_test,y_train,y_test = train_test_split(X,y)
knn_clf.fit(X_train,y_train)
knn_clf.score(X_test,y_test)
超参数
超参数是模型运行前必须要决定的参数,例如k近邻算法中的k值和距离
确定超参数一般使用的方法:厦门叉车价格哪家便宜领域知识
经验数值
实验探索
确定knn算法用于digits数据集的最佳超参数
//使用网格搜索法确定weights和k超参数
best_k = -1
best_score = -1
methods = ["uniform","distance"]
best_method = ""for method in methods: for k in range(1,11):
knn_clf = KNeighborsClassifier(n_neighbors=k,weights=method)
knn_clf.fit(X_train,y_train)
score = knn_clf.score(X_test,y_test) if(score>best_score):
best_k = k
best_score = score
best_method = methodprint("best_k = ",best_k)print("best_score = ",best_score)print("best_method = ",best_method)
best_k = 3
best_score = 0.9888888888888889
best_method = uniform
best_k = -1
best_score = -1
best_p=-1for p in range(1,6): for k in range(1,11):
knn_clf = KNeighborsClassifier(n_neighbors=k,weights="distance",p=p)
knn_clf.fit(X_train,y_train)
score = knn_clf.score(X_test,y_test) if(score>best_score):
best_k = k
best_score = score
best_p = pprint("best_k = ",best_k)print("best_score = ",best_score)print("best_p = ",best_p)
best_k = 3
best_score = 0.9888888888888889
best_p = 2
Python3入门机器学习 - k近邻算法的更多相关文章
- [机器学习] k近邻算法
算是机器学习中最简单的算法了,顾名思义是看k个近邻的类别,测试点的类别判断为k近邻里某一类点最多的,少数服从多数,要点摘录: 1. 关键参数:k值 && 距离计算方式 &&am ...
- 机器学习(1)——K近邻算法
KNN的函数写法 import numpy as np from math import sqrt from collections import Counter def KNN_classify(k ...
- 1.K近邻算法
(一)K近邻算法基础 K近邻(KNN)算法优点 思想极度简单 应用数学知识少(近乎为0) 效果好 可以解释机器学习算法使用过程中的很多细节问题 更完整的刻画机器学习应用的流程 图解K近邻算法 上图是以 ...
- 第四十六篇 入门机器学习——kNN - k近邻算法(k-Nearest Neighbors)
No.1. k-近邻算法的特点 No.2. 准备工作,导入类库,准备测试数据 No.3. 构建训练集 No.4. 简单查看一下训练数据集大概是什么样子,借助散点图 No.5. kNN算法的目的是,假如 ...
- 机器学习实战 - python3 学习笔记(一) - k近邻算法
一. 使用k近邻算法改进约会网站的配对效果 k-近邻算法的一般流程: 收集数据:可以使用爬虫进行数据的收集,也可以使用第三方提供的免费或收费的数据.一般来讲,数据放在txt文本文件中,按照一定的格式进 ...
- Python3入门机器学习经典算法与应用
<Python3入门机器学习经典算法与应用> 章节第1章 欢迎来到 Python3 玩转机器学习1-1 什么是机器学习1-2 课程涵盖的内容和理念1-3 课程所使用的主要技术栈第2章 机器 ...
- Python3入门机器学习经典算法与应用☝☝☝
Python3入门机器学习经典算法与应用 (一个人学习或许会很枯燥,但是寻找更多志同道合的朋友一起,学习将会变得更加有意义✌✌) 使用新版python3语言和流行的scikit-learn框架,算法与 ...
- K近邻算法:机器学习萌新必学算法
摘要:K近邻(k-NearestNeighbor,K-NN)算法是一个有监督的机器学习算法,也被称为K-NN算法,由Cover和Hart于1968年提出,可以用于解决分类问题和回归问题. 1. 为什么 ...
- 机器学习之K近邻算法(KNN)
机器学习之K近邻算法(KNN) 标签: python 算法 KNN 机械学习 苛求真理的欲望让我想要了解算法的本质,于是我开始了机械学习的算法之旅 from numpy import * import ...
随机推荐
- snip
首先明确物体太小太大都不好检测(都从roi的角度来分析): 1.小物体: a.本身像素点少,如果从anchor的点在gt像素内来说,能提取出来的正样本少 b.小物体会出现iou过低.具体来说 ...
- 解决Mac外接显示器经常没反应
问题描述 最近在使用绿联扩展坞的时候,发现连接显示器时,有时插上后可以正常使用,有时插上后显示器没反应. 解决办法 经过一段时间的尝试,发现这样操作可以避免出现这种问题: 关机的时候: 从转换器拔掉H ...
- MySQL(四)执行计划
转载自:Oo若离oO,原文链接 在MySQL中使用explain查询SQL的执行计划 目录 一.什么是执行计划 二.如何分析执行计划 一.什么是执行计划 要对执行计划有个比较好的理解,需要先对MySQ ...
- P2049 魔术棋子
题目描述 在一个M*N的魔术棋盘中,每个格子中均有一个整数,当棋子走进这个格子中,则此棋子上的数会被乘以此格子中的数.一个棋子从左上角走到右下角,只能向右或向下行动,请问此棋子走到右下角后,模(mod ...
- selenium和PhantomJS的安装
针对w10系统 selenium安装 pip install selenium 默认安装的是3.x版本,但是3.x版本不支持PhantomJS,所以要安装2.x版本 pip install selen ...
- C++中关于配置文件的问题
眼下本人考虑到部门配置文件较多,所以想写个配置文件检測程序. 眼下大致的思路例如以下三部分; 1, 读取配置文件的内容(*.ini). 查找配置文件,代码例如以下 void CDataBaseDlg: ...
- 展开label,利用YYText实现文字显示不完末尾添加全文
效果图: 操作 先github下载<YYText>文件导入, 代码如下: #import "ViewController.h" #import "YYLabe ...
- 我的react学习
基础部分 创建一个react的项目 创建一个react的项目 全局安装 react 指令 // 全局安装react (根据需要安装,不是必须的) npm i -g react // 或者 yarn - ...
- DQL-分页查询
关键字 :limit 一.应用场景当要查询的条目数太多,一页显示不全二.语法 select 查询列表from 表limit [offset,]size;注意:offset代表的是起始的条目索引,默认从 ...
- php使用urlencode对中文编码而引出的问题:urlencode和rawurlencode的区别
事件背景: 之前做h5小游戏,需要后端输出用户的相关信息给前端,输出的内容有:用户id,用户昵称等字段,使用get方式传参.后端使用PHP语言对中文昵称进行格式化编码,使用的是常用的urlencode ...