最简单的K近邻算法 KNN python实现
2017-10-05 16:13
381 查看
这是一个最简单的KNN 算法实现
题目来源于<机器学习实战>
1,首先,必须熟悉Numpy的几个常用函数,都是关于矩阵运算的
1.0 首先,我们使用这种方式来构建一个矩阵:
matrixA = array( [
[1, 2.5, 3],
[2, 3, 9.9],
])
1.1 shape
用来求取矩阵的行,列数
matrixA.shape 将得到 (2,3) 意为2行,3列;
matrixA.shape[0] 将得到 2, 意为 2行
matrixA.shape[1] 将得到 3, 意为 3列
1.2 tile
tile(matrixA, (2,1)) 求得 matrixA 的扩充矩阵, 扩充的方法,由后面的(2,1)指定; 2指定按行扩充倍数, 1指定按列扩充倍数
------------------------------------(2 ,2) --------------------------------------> [ [ 1, 2.5, 3 , 1, 2.5, 3 ]
[ [1, 2.5, 3] (2,1)------> [ [1, 2.5, 3] [ 2, 3, 9.9 2, 3, 9.9 ]
[2, 3, 9.9] [ 2, 3, 9.9] [ 1, 2.5, 3 , 1, 2.5, 3 ]
] [1, 2.5, 3] [ 2, 3, 9.9 2, 3, 9.9 ]
[2, 3, 9.9 ] ] ]
1.3 sum
sum(matrixA, axis=0) 将矩阵按行向量相加, 得到单行矩阵 [ 3, 5.5, 12.9]
sum(matrixA, axis =1) 将矩阵按列向量相加,并把得到的单列矩阵转置为单行矩阵 [ 6.5, 14.9]
1.4 argsort
argsort(dis) 对单行矩阵排序,得到一个由小到大排序后的序号;
如 argsort(array([2, 4, 3, 1])) 得到 [ 3, 0, 2, 1] 注意这里保存的是序号值. 本身的值并没有挪动.
2. 现在进入算法
2.1 定义一个数据集, 这个作为计算距离使用的邻近点,必须是:
1) 各向量值已知的
2) 已经分类的, 分类标签保存在 labels中.
3) 这个数据集的数量需要自行控制
def createDataSet():
group = array([
[1.0,0.9],
[1.0,1.0],
[0.1,0.2],
[0.0,0.1]
])
labels = ['A', 'A','B', 'B']
return group, labels
2.2 正式的分类计算
1, 取出数据向量(一行),构建一个扩充矩阵扩充到数据集的行数那么多.
2, 两个矩阵相减, 并且各分量平方运算.
3, 按列相加, 这样就得到待分类点与邻居点的距离平方
4, 求方根.得到距离
5, 距离排序, 取最小的K个值
6, 统计这K个值都是什么标签类型的,统计数最多的选定为 本对象的分类
#knn 算法,
# newinput: 输入待分类数据
# dataSet, labels已构建好的数据集和标签
#K 选择多少个距离最近的邻近点作为参考
题目来源于<机器学习实战>
1,首先,必须熟悉Numpy的几个常用函数,都是关于矩阵运算的
1.0 首先,我们使用这种方式来构建一个矩阵:
matrixA = array( [
[1, 2.5, 3],
[2, 3, 9.9],
])
1.1 shape
用来求取矩阵的行,列数
matrixA.shape 将得到 (2,3) 意为2行,3列;
matrixA.shape[0] 将得到 2, 意为 2行
matrixA.shape[1] 将得到 3, 意为 3列
1.2 tile
tile(matrixA, (2,1)) 求得 matrixA 的扩充矩阵, 扩充的方法,由后面的(2,1)指定; 2指定按行扩充倍数, 1指定按列扩充倍数
------------------------------------(2 ,2) --------------------------------------> [ [ 1, 2.5, 3 , 1, 2.5, 3 ]
[ [1, 2.5, 3] (2,1)------> [ [1, 2.5, 3] [ 2, 3, 9.9 2, 3, 9.9 ]
[2, 3, 9.9] [ 2, 3, 9.9] [ 1, 2.5, 3 , 1, 2.5, 3 ]
] [1, 2.5, 3] [ 2, 3, 9.9 2, 3, 9.9 ]
[2, 3, 9.9 ] ] ]
1.3 sum
sum(matrixA, axis=0) 将矩阵按行向量相加, 得到单行矩阵 [ 3, 5.5, 12.9]
sum(matrixA, axis =1) 将矩阵按列向量相加,并把得到的单列矩阵转置为单行矩阵 [ 6.5, 14.9]
1.4 argsort
argsort(dis) 对单行矩阵排序,得到一个由小到大排序后的序号;
如 argsort(array([2, 4, 3, 1])) 得到 [ 3, 0, 2, 1] 注意这里保存的是序号值. 本身的值并没有挪动.
2. 现在进入算法
2.1 定义一个数据集, 这个作为计算距离使用的邻近点,必须是:
1) 各向量值已知的
2) 已经分类的, 分类标签保存在 labels中.
3) 这个数据集的数量需要自行控制
def createDataSet():
group = array([
[1.0,0.9],
[1.0,1.0],
[0.1,0.2],
[0.0,0.1]
])
labels = ['A', 'A','B', 'B']
return group, labels
2.2 正式的分类计算
1, 取出数据向量(一行),构建一个扩充矩阵扩充到数据集的行数那么多.
2, 两个矩阵相减, 并且各分量平方运算.
3, 按列相加, 这样就得到待分类点与邻居点的距离平方
4, 求方根.得到距离
5, 距离排序, 取最小的K个值
6, 统计这K个值都是什么标签类型的,统计数最多的选定为 本对象的分类
#knn 算法,
# newinput: 输入待分类数据
# dataSet, labels已构建好的数据集和标签
#K 选择多少个距离最近的邻近点作为参考
def KnnClass(newInput, dataSet, labels, k): vetors=dataSet.shape[0] #取矩阵的行数 #title 根据输入矩阵,新建一个扩充矩阵,行列数由(nvetors,1)决定多行,单列 #[1,2] --(2,1)--> [1,2] #[3,4] [3,4] # [1,2] # [3,4] diff = tile(newInput, (vetors,1)) - dataSet #和数据集向量求差 squDiff= diff ** 2 #求差后向量平方 squDist = sum(squDiff, axis =1) # 按列相加求和,并转置成行 axis=0,则是按行相加 dis = squDist ** 0.5 #各列向量分别求平方根 sortedDistInd = argsort(dis) #索引排序,值最小的在前 classCount = {} #取出距离最小的邻居点,找到标签给它计数 for i in xrange(k): voteLabel = labels[sortedDistInd[i]] classCount[voteLabel] = classCount.get(voteLabel,0) + 1 #从已经计算的K个邻近点标签中选出出现最多次数的 maxCount = 0 for key, value in classCount.items(): if value > maxCount: maxCount = value maxIndex = key return maxIndex
相关文章推荐
- K最近邻结点算法(k-Nearest Neighbor algorithm)KNN——python简单实现
- 【机器学习算法-python实现】KNN-k近邻算法的实现(附源代码)
- KNN (K最近邻接算法)python 语言下的简单实现
- 【机器学习算法-python实现】KNN-k近邻算法的实现(附源码)
- Python简单实现KNN算法及绘图练习
- KNN的简单实现(python)
- 简单的KNN的python实现
- kNN算法python实现和简单数字识别的方法
- 机器学习实战笔记(Python实现)-02-k近邻算法(kNN)
- kNN算法python实现和简单数字识别
- 【机器学习算法-python实现】KNN-k近邻算法的实现(附源码)
- 《李航:统计学习方法》--- K近邻算法(KNN)原理与简单实现
- python KNN算法的简单实现
- python之KNN算法的简单实现
- python实现简单kNN
- 【机器学习算法-python实现】KNN-k近邻算法的实现(附源码)
- 机器学习实战笔记(Python实现)-02-k近邻算法(kNN)
- 机器学习实战笔记(Python实现)-02-k近邻算法(kNN)
- 机器学习算法的python实现(1)---k近邻算法(kNN)
- 【机器学习系列】kNN(k近邻算法)的python实现