机器学习03:K近邻算法
本文来自同步博客。
P.S. 不知道怎么显示数学公式以及排版文章。所以如果觉得文章下面格式乱的话请自行跳转到上述链接。后续我将不再对数学公式进行截图,毕竟行内公式截图的话排版会很乱。看原博客地址会有更好的体验。
本文内容介绍机器学习的K近邻算法,用它处理分类问题。分类问题的目标是利用采集到的已经经过分类处理的数据来预测新数据属于何种类别。
K近邻算法
K近邻算法对给定的某个新数据,让它与采集到的样本数据点分别进行比较,从中选择最相似的K个点,然后统计这K个点中出现的各个类别的频数,并判定频数最高的类别作为新数据所属的类别。
这里有个问题是如何判定样本数据与新数据是否相似。常用的一种计算方法叫欧几里得距离。
欧几里得距离(Euclidean Distance)
假设有两个数据分别是:$- X = (x_1,x_2,...,x_n) -$和$- Y = (y_1,y_2,...,y_n) -$。则$-X-$与$-Y-$的距离为:
$$ D = \sqrt{\sum_{i=1}{n}(x_i-y_i)2} $$
用Python实现这个式子代码如下:
def euclidean_distance(x, y):
if len(x) != len(y):
warnings.warn('Input error')
return sqrt( sum( [(x[i] - y[i])**2 for i in range(0, len(x))] ) ) print(euclidean_distance([1,2,3], [2,4,5]))
NumPy提供则可以用下面方法计算两个ndarray的距离:
np.linalg.norm(np.array([1,2,3]) - np.array([2,4,5]))
实现K近邻算法
接下来依照上面描述的算法原理实现K近邻算法。先定义一下输入数据的格式:
#二维测试数据的格式
dataset = {'k': [[1,2],[2,3],[3,1]], 'r':[[6,5],[7,7],[8,6]]}
new_features = [5,7]
我们假定样本数据的结构如dataset为一个字典类型的数据,字典的元素的关键字为类型名称,元素值为一个包含该类型所有样本点的列表。新数据为一个数据点。
所以K近邻算法的实现如下:
# KNN实现
def k_nearest_neighbors(data, predict, k=3):
if len(data) >= k:
warnings.warn('K less than total voting groups')
# 计算距离
distances = []
for group in data:
for features in data[group]:
#distance = euclidean_distance(features, predict)
distance = np.linalg.norm(np.array(features)-np.array(predict))
distances.append([distance, group])
# 排序后取前k项数据类别构成新数组
votes = [i[1] for i in sorted(distances)[:k]]
# 统计数组中频数最高的类别
vote_result = Counter(votes).most_common(1)[0][0]
return vote_result # 调用KNN
result = k_nearest_neighbors(dataset, new_features, k=3)
print(result)
使用真实数据测试
在UCI网站的机器学习数据库中可以找到Breast Cancer Wisconsin(Original)的真实统计数据。数据可以从这个链接下载,数据的描述可以看这个链接。
看到数据描述中提到了数据每一列的定义如下:

这份数据的预测目标是判断给定特征数据对应的乳癌情况,2表示良性、4表示恶性。
根据描述我们先处理一下下载到的数据,给它的每一列加上个列名。这样在Python里面就可以把它当成一个CSV文件处理。我这里把它保存到了一个名为breast-cancer-wisconsin.data的文件里。形状如下:

数据里面还有一些统计不到的数据,用英文问号?表示。还有一个很奇怪的现象是数据读取进来后有些数字会被处理成字符串类型,如'1'这样的数据。这些都需要我们提前处理一下。
df = pd.read_csv('./dataset/breast-cancer-wisconsin.data')
# 处理问号
df.replace('?', -99999, inplace=True)
# id字段不应该当成一个统计特征字段,因此去除该列的内容
df.drop(['id'], 1, inplace=True)
# 源数据有部分数据是字符串,如'1',这对我们的模型有影响,所以整理一下类型
# 用列表存放数据
full_data = df.astype(float).values.tolist()
random.shuffle(full_data) # 洗乱数据
接下来生成训练数据集和统计数据集,代码如下:
# 生成训练数据集和统计数据集
test_size = 0.2
train_set = {2:[], 4:[]} # 训练集,占80%
test_set = {2:[], 4:[]} # 统计集,占20%
train_data = full_data[:-int(test_size*len(full_data))]
test_data = full_data[-int(test_size*len(full_data)):]
for i in train_data:
train_set[i[-1]].append(i[:-1])
for i in test_data:
test_set[i[-1]].append(i[:-1])
最后,利用上述KNN函数统计测试数据的准确性。
correct = 0
total = 0
for group in test_set:
for data in test_set[group]:
vote = k_nearest_neighbors(train_set, data, k=5)
if group == vote:
correct += 1
total += 1
# 打印结果
print('correct: ', correct)
print('total: ', total)
print('Accuracy: ', correct/total)
完整代码请查看github链接。
sklearn的K近邻算法
同样需要先处理一下数据并生成符合sklearn的输入格式的数据集。
from sklearn import model_selection
# 读取乳癌统计数据
df = pd.read_csv('./dataset/breast-cancer-wisconsin.data')
# 处理问号
df.replace('?', -99999, inplace=True)
# 因为ID字段与分类无关,所以去除他先,稍后我们看一下它的影响
df.drop(['id'], 1, inplace=True)
df = df.astype(float) # 生成数据集
X = np.array(df.drop(['class'], 1))
y = np.array(df['class'])
X_train, X_test, y_train, y_test = model_selection.train_test_split(X, y, test_size=0.2)
然后生成KNN模型对象,用数据训练模型,评估模型准确性。
from sklearn import neighbors
# 构建模型与训练
clf = neighbors.KNeighborsClassifier()
clf.fit(X_train, y_train) # 计算精确度
accuracy = clf.score(X_test, y_test)
print('Accuracy: ', accuracy) # 预测我们自己构造的数据属于哪个类型
example_measures = np.array([[4,2,1,1,1,2,3,2,1],[2,3,4,4,1,2,3,4,1]])
prediction = clf.predict(example_measures)
print('Predict resuct: ', prediction)
完整代码请查看github链接。
机器学习03:K近邻算法的更多相关文章
- 机器学习之K近邻算法(KNN)
机器学习之K近邻算法(KNN) 标签: python 算法 KNN 机械学习 苛求真理的欲望让我想要了解算法的本质,于是我开始了机械学习的算法之旅 from numpy import * import ...
- 【机器学习】k近邻算法(kNN)
一.写在前面 本系列是对之前机器学习笔记的一个总结,这里只针对最基础的经典机器学习算法,对其本身的要点进行笔记总结,具体到算法的详细过程可以参见其他参考资料和书籍,这里顺便推荐一下Machine Le ...
- 第四十六篇 入门机器学习——kNN - k近邻算法(k-Nearest Neighbors)
No.1. k-近邻算法的特点 No.2. 准备工作,导入类库,准备测试数据 No.3. 构建训练集 No.4. 简单查看一下训练数据集大概是什么样子,借助散点图 No.5. kNN算法的目的是,假如 ...
- 机器学习之K近邻算法
K 近邻 (K-nearest neighbor, KNN) 算法直接作用于带标记的样本,属于有监督的算法.它的核心思想基本上就是 近朱者赤,近墨者黑. 它与其他分类算法最大的不同是,它是一种&quo ...
- 机器学习实战-k近邻算法
写在开头,打算耐心啃完机器学习实战这本书,所用版本为2013年6月第1版 在P19页的实施kNN算法时,有很多地方不懂,遂仔细研究,记录如下: 字典按值进行排序 首先仔细读完kNN算法之后,了解其是用 ...
- 【机器学习】K近邻算法——多分类问题
给定一个训练数据集,对新的输入实例,在训练数据集中找到与该实例最邻近的K个实例,这K个实例的多数属于某个类,就把该类输入实例分为这个类. KNN是通过测量不同特征值之间的距离进行分类.它的的思路是:如 ...
- 机器学习2—K近邻算法学习笔记
Python3.6.3下修改代码中def classify0(inX,dataSet,labels,k)函数的classCount.iteritems()为classCount.items(),另外p ...
- [机器学习] k近邻算法
算是机器学习中最简单的算法了,顾名思义是看k个近邻的类别,测试点的类别判断为k近邻里某一类点最多的,少数服从多数,要点摘录: 1. 关键参数:k值 && 距离计算方式 &&am ...
- 机器学习:k-NN算法(也叫k近邻算法)
一.kNN算法基础 # kNN:k-Nearest Neighboors # 多用于解决分裂问题 1)特点: 是机器学习中唯一一个不需要训练过程的算法,可以别认为是没有模型的算法,也可以认为训练数据集 ...
随机推荐
- 通过自定义的URL Scheme启动你的App
iPhone SDK可以把你的App和一个自定义的URL Scheme绑定.该URL Scheme可用来从浏览器或别的App启动你的App. 如何响应从别的App里发给你的URL Scheme申请,由 ...
- 优化 gruop by 语句
默认情况下,mysql对所有的gruop by col1,col2...的字段进行排序.如果查询包含group by但用户想要避免排序结果的消耗,则可以指定order by null禁止排序. exp ...
- linux ssh登录的小知识
查看服务器的各个端口: # netstat -tulnp 或者 #netstat -tnip 筛选在后面添加 |grep *** 准许root登录 #vi /etc/ssh/sshd_config 找 ...
- java虚拟机和java内存区域概述
什么是虚拟机,什么是Java虚拟机 虚拟机 定义:模拟某种计算机体系结构,执行特定指令集的软件 系统虚拟机(Virtual Box.VMware),进程虚拟机 进程虚拟机 jvm.Adobe Flas ...
- PHP读取XML文件
xml主键被json取代,大概了解一下就OK了 简要: 加载xml文件:$xml = simplexml_load_file('sa.xml');//$xml是一个对象 读取节点:echo $xml- ...
- [DeeplearningAI笔记]ML strategy_2_1误差分析
机器学习策略-误差分析 觉得有用的话,欢迎一起讨论相互学习~Follow Me 2.1 误差分析 训练出来的模型往往没有达到人类水平的效果,为了得到人类水平的结果,我们对原因进行分析,这个过程称为误差 ...
- JavaScript函数调用模式
1.方法调用模式: var myObj = { value : 0; increment:function(inc){ this.value += typeof inc === 'number' ? ...
- 使用localhost可以访问,但使用本地ip+端口号无法访问
今天想使用ip访问本机的iview-admin项目,结果怎么配置都无法访问,根据iview工程执行的命令npm run dev了解到是webpack配置的问题,打开工程里的node_modules文件 ...
- WEB消息推送-框架篇
WEB消息推送-comet4j 一.comet简介: comet :基于 HTTP长连接的“服务器推”技术,是一种新的 Web 应用架构.基于这种架构开发的应用中,服务器端会主动以异步的方式向客户端程 ...
- xBIM 使用Linq 来优化查询
目录 xBIM 应用与学习 (一) xBIM 应用与学习 (二) xBIM 基本的模型操作 xBIM 日志操作 XBIM 3D 墙壁案例 xBIM 格式之间转换 xBIM 使用Linq 来优化查询 x ...