您的位置:首页 > 编程语言 > Python开发

<基础原理进阶>机器学习算法python实现【1】--分类简谈&KNN算法

2017-05-17 10:02 1511 查看
#####################

适合对算法的数学描述有一定理解的童鞋看~~

对TensorFlow中直接封装好的算法的具体Python实现等等,补充另一个分类中的知识

参考书籍: 《机器学习实战》等

有些代码我自己也有问题,思考中已经解答的问题和一些坑我会注意说明的。也欢迎大家提出问题,相互交流进步

学习之后记录博客,对自己起到supervised learning的作用 :)

大家一起学习,进步,享受深度学习的乐趣吧!

需要引用的数据集,以及完整代码,放在github上,与这个的标题一一对应的~
https://github.com/Skyorca/csdn-
#####################
上次说过了supervised learning的回归(连续),这次来谈谈分类。最近开始学习computer vision的内容,其核心就是image classification。所以不得不看了看分类问题。最基本的算法就是KNN算法。它的核心思想是本身的属性由所属的“小圈子”决定,即nearest neighbour。这个算法看起来很奇怪,因为它的本身并没有包含任何训练的内容,而是在每次输入一个数据时,才发挥 一次“分类器”的作用,进行一个输出。是一个懒惰算法。
以图片为例,假设某个训练集的graph是3*3*3(RGB)的三维矩阵,每一层都有9个pixel,强度为[0,255]之间的一个值;比如说它一共1000张图,已经分为ABCDE五类(labels)。也许我们会用一个normalization的过程,将[0,255]之间的数转换成[-1,1]之间的数,这个是预处理数据的过程。接下来进入算法部分:

1. 对于一个输入图,计算它的3*3矩阵的每一个点与每一张训练集的图矩阵对应位置的点的距离。一般我们采用欧式距离,就是我们平常在坐标系中算的点距离,差值平方之和,得到距离的3*3矩阵(当然,实际可能还要考虑通道厚度那块儿)

2.将这个矩阵上的九个数值加起来得到距离。由于有1000张训练图,所以会有1000个距离。从小到大进行排序,根据k值选择从小开始的k个距离。每个距离对应着label中的某一类。然后进行投票,选择这k个中票数最多的一个类别。注意投票可以优化成加权投票,对于距离越近的给的权重越大。

#K-NN classification for graphs
# Stanford CS231c

import numpy as np
import operator

def create_data_set():
group = np.array([[1.0, 1.1], [1.0, 1.0], [0, 0], [0, 0.1]])
labels = ['A', 'A', 'B', 'B']
return group, labels

def knn(input_data, dataset, labels, k):  #note that dataset is the group we generated from the above
#doing distance
dataset_size = dataset.shape[0]
diff_mat = np.tile(input_data, (dataset_size, 1)) - dataset
sqDiff_mat = diff_mat**2
sqDistances = sqDiff_mat.sum(axis=1)
distances = sqDistances**0.5
sortedDistance = distances.argsort()
classCount={}
#vote
for i in range(k):
voteLabel = labels[sortedDistance[i]]
classCount[voteLabel] = classCount.get(voteLabel, 0)+1
#sort and select k
sortedClassCount = sorted(classCount.iteritems(), key=operator.itemgetter(1), reverse=True)
return sortedClassCount[0][0]

group, labels = create_data_set()
print knn([0.5, 0.5], group, labels, 3)


排序的过程,思想大概如下:我通过k值选择了一系列label: ABBCDDECCCBA......那么怎么统计每个label出现次数并对它排序选择出现频率最大的那个呢?这里先组成一个字典,每个key是label,value是出现次数,然后逆序排序,第一个就是需要的label。比如:dict={A:3, B:2, C:8, D:1, E:2},处理之后变成[[C, 8], [A, 3], [B, 2], [E, 2], [D, 1]],相当于5*2矩阵。所以选取[0][0]即为label
C.

对于不同的input_data, 会选出不同的label。

[0.5, 0.5] B

[0.8, 0.8] A

[1.2, 1.2] A

......

这里的group, label, input可以随意改变,越复杂得到的乐趣越多。

天空鱼
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐