前提基础
安装好Numpy库
基础知识:
(1)numpy.tile
import numpy
numpy.tile([1,2],(1,2))
Out[3]:
array([[1, 2, 1, 2]])
numpy.tile([1,2],(2,2))
numpy.tile([1,2],(2,2))//第一个参数是重复的数 第二个参数(行,列)重复的次数
Out[4]:
array([[1, 2, 1, 2],
[1, 2, 1, 2]])
2.shape
numpy.shape([[1,2],[2,2]])
Out[21]:
(2, 2)
numpy.shape(a)
Out[22]:
(3, 2)
a
Out[23]:
[[1.0, 1.1], [1, 1.0], [0.0, 1.0]]
a是一个矩阵
返回3行 2列
shape函数是numpy.core.fromnumeric中的函数,它的功能是读取矩阵的长度,比如shape[0]就是读取矩阵第一维度的长度。
3.平方 开方
1**2Out[24]: 14**2#4的平方Out[25]: 1616**0.5#开方Out[26]: 4.0
4.argsort()
x=numpy.array([1,2,3,-1,5])
x.argsort()
Out[28]:
array([3, 0, 1, 2, 4], dtype=int64)
我们发现argsort()函数是将x中的元素从小到大排列,提取其对应的index(索引),然后输出到y。 注意输出的是索引
5.
operator.itemgetter函数
operator模块提供的itemgetter函数用于获取对象的哪些维的数据,参数为一些序号。看下面的例子
a = [1,2,3]
>>> b=operator.itemgetter(1) //定义函数b,获取对象的第1个域的值
>>> b(a)
2
>>> b=operator.itemgetter(1,0) //定义函数b,获取对象的第1个域和第0个的值
>>> b(a)
(2, 1)
要注意,operator.itemgetter函数获取的不是值,而是定义了一个函数,通过该函数作用到对象上才能获取值。
sorted函数用来排序,sorted(iterable[, cmp[, key[, reverse]]])
其中key的参数为一个函数或者lambda函数。所以itemgetter可以用来当key的参数
a = [('john', 'A', 15), ('jane', 'B', 12), ('dave', 'B', 10)]
根据第二个域和第三个域进行排序
sorted(students, key=operator.itemgetter(1,2))
6.sorted()
sorted(...)
sorted(iterable, cmp=None, key=None, reverse=False)--> new sorted list
iterable:是可迭代类型;
cmp:用于比较的函数,比较什么由key决定;
key:用列表元素的某个属性或函数进行作为关键字,有默认值,迭代集合中的一项;
reverse:排序规则. reverse = True 降序 或者 reverse = False 升序,有默认值。
返回值:是一个经过排序的可迭代类型,与iterable一样。
参数说明:
(1) cmp参数
cmp接受一个函数,拿整形举例,形式为:
def f(a,b):
return a-b
如果排序的元素是其他类型的,如果a逻辑小于b,函数返回负数;a逻辑等于b,函数返回0;a逻辑大于b,函数返回正数就行了
(2) key参数
key也是接受一个函数,不同的是,这个函数只接受一个元素,形式如下
def f(a):
return len(a)
key接受的函数返回值,表示此元素的权值,sort将按照权值大小进行排序
(3) reverse参数
接受False 或者True 表示是否逆序
例子:
按照元素长度排序
L = [{1:5,3:4},{1:3,6:3},{1:1,2:4,5:6},{1:9}]
deff(x):
returnlen(x)
sort(key=f)
printL
输出:
[{1: 9}, {1: 5, 3: 4}, {1: 3, 6: 3}, {1: 1, 2: 4, 5: 6}]
K-近邻算法
2.7:
#coding utf-8
from numpy import *
import operator
def createDataSet():
group = array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]])
labels = ['A','A','B','B']
return group,labels
def classsify0(inx,dataset,labels,k):
datasetSize = dataset.shape[0]
diffMat = tile(inx,(datasetSize,1)) - dataset
sqDiffMat = diffMat**2
sqDistances = sqDiffMat.sum(axis=1)
distances = sqDistances**0.5
sortedDistIndicies = distances.argsort()
classCount = {}
for i in range(k):
voteIlable = labels[sortedDistIndicies[i]]
classCount[voteIlable] = classCount.get(voteIlable,0) + 1
sortedClassCount = sorted(classCount.iteritems(),key=operator.itemgetter(1),reverse=True)
return sortedClassCount[0][0]
if __name__ == '__main__':
group,labels = createDataSet()
a= classsify0([0,0],group,labels,3)
print(a)
3
#coding utf-8
from numpy import *
import operator
def createDataSet():
group = array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]])
labels = ['A','A','B','B']
return group,labels
def classsify0(inx,dataset,labels,k):
datasetSize = dataset.shape[0]
diffMat = tile(inx,(datasetSize,1)) - dataset
sqDiffMat = diffMat**2
sqDistances = sqDiffMat.sum(axis=1)#1 按行求和 0按列求和 这样得到距离的计算
distances = sqDistances**0.5
sortedDistIndicies = distances.argsort()
classCount = {}
for i in range(k):
voteIlable = labels[sortedDistIndicies[i]]
classCount[voteIlable] = classCount.get(voteIlable,0) + 1
sortedClassCount = sorted(classCount.items(),key=operator.itemgetter(1),reverse=True)
return sortedClassCount[0][0]
if __name__ == '__main__':
group,labels = createDataSet()
a= classsify0([0,0],group,labels,3)
print(a)
将文本记录转换NumPy的解析程序
def file2matrix(filename):
fr = open(filename)
arrayOflines =fr.readline()
numberOflines = len(arrayOflines)
returnMat = zeros((numberOflines,3))
classLabelVector = []
index = 0
for line in arrayOflines:
line = line.strip()
listFromLine = line.split('\t')
returnMat[index,:] = listFromLine[0:3]
classLabelVector.append(int(listFromLine[-1]))
index += 1
return returnMat,classLabelVector
----------------------------------------------10.29更新--------------------------------------------------
k近邻算法的一般流程
收集数据:可以使用任何方法。
准备数据:距离计算所需要的数值,最好是结构化的数据格式。
分析数据:可以使用任何方法。
训练算法:此步骤不适用于k近邻算法。
测试算法:计算错误率。
使用算法:首先需要输入样本数据和结构化的输出结果,然后运行k近邻算法判定输入数据分别属于哪个分类,最后应用对计算出的分类执行后续的处理。
向量labels包含了每个数据点的标签信息,labels包含的元素个数等于group矩阵行数。
例子:把一个32x32的二进制图像矩阵转换为1x1024的向量
from numpy import *
def img2vector(filename):
#创建向量
returnVect = zeros((1,1024))
#打开文件夹
fr = open(filename)#32行
for i in range(32):#读取每一行
lineStr = fr.readline()#一行有32个数据
for j in range(32):将每行前32字符转成int存入向量returnVect[0,32*i+j] = int(lineStr[j])
return returnVect
计算“距离”
算法实现过程:
计算已知类别数据集中的点与当前点之间的距离;
按照距离递增次序排序;
选取与当前点距离最小的k个点;
确定前k个点所在类别的出现频率;
返回前k个点出现频率最高的类别作为当前点的预测分类。
算法实现为函数classify0(),函数的参数包括:
inX:用于分类的输入向量
dataSet:输入的训练样本集
labels:样本数据的类标签向量
k:用于选择最近邻居的数目