- 标签需要人工大量时间去标注。
- 监督学习:标签,分类
- 非监督学习:没有标签,聚类(相似数据归类)
- 半监督学习:semi-supervised Learning:有少部分标签。最类似人的生活
- 强化学习:Reinforcement Learing:基于环境而定
- 回归(regression)
- 机器学习的“六步走”
- 机器学习“关键三步”
- 过拟合:overfitting
- 过拟合解决方案
- KNN邻近算法
- 计算一个简单KNN
- 数字识别
- numpy函数shape[0]返回dataSet的行数
- 在列向量方向上重复inX共1次(横向),行向量方向上重复inX共dataSetSize次(纵向)
- 二维特征相减后平方
- sum()所有元素相加,sum(0)列相加,sum(1)行相加
- 开方,计算出距离
- 返回distances中元素从小到大排序后的索引值
- 定一个记录类别次数的字典
- python3中用items()替换python2中的iteritems()
- key=operator.itemgetter(1)根据字典的值进行排序
- key=operator.itemgetter(0)根据字典的键进行排序
- reverse降序排序字典
- 返回次数最多的类别,即所要分类的类别
标签需要人工大量时间去标注。
监督学习:标签,分类
非监督学习:没有标签,聚类(相似数据归类)
半监督学习:semi-supervised Learning:有少部分标签。最类似人的生活
强化学习:Reinforcement Learing:基于环境而定
回归(regression)
-
机器学习的“六步走”
收集数据—>准备数据—>选择/建立模型—>训练模型—>测试模型—>调节模型参数
机器学习“关键三步”
找一系列函数来实现预期功能:建模问题
- 找一组合理的评判标准,来评估函数的好坏:评价问题
-
过拟合:overfitting
拟合结果
降低数据量
- 正则化
- Dropout(丢弃、退出)
KNN邻近算法
K值不大于20
输入数据与训练集的数之间距离最小出现频率最高的就是K邻近算法
一些计算矩阵数据相关函数
tile:重复深度为1
a = array([0, 1, 2])
b = tile(a, (2, 1))
print(b)
//结果为[[0, 1, 2], [0, 1, 2]]
找出最小值的索引
>>> x = np.array([3, 1, 2])
>>> np.argsort(x)
array([1, 2, 0])
计算一个简单KNN
# -*- coding:UTF-8 -*-import numpy as npimport operator"""创建数据集returns:group-数据集组lables-分类标签"""def createDataSet():#xy分别代表数据的特征#构建4组二维特征 x表示打架,y表示接吻group = np.array(([1.8,2.5,3.9],[1.85,2.4,4.2],[3.4,3.3,2.3],[3.7,3.2,1.89],[1.45,3.6,5.6],[7.08,4.3,1.23],[3.3,3.2,2.33],[3.3,3.1,2.33],[3.3,3.4,2.33]))#4组数据标签lables = ['主队胜利','主队胜利','平局','客队胜利','主队胜利','客队胜利','平局','平局','平局']return group,lables"""分类器a = array([0, 1, 2])b = tile(a, (2, 1))print(b)//结果为[[0, 1, 2],[0, 1, 2]]One dimensional array:一维数组>>> x = np.array([3, 1, 2])>>> np.argsort(x)array([1, 2, 0])参数:inX:测试数据是数组类型[101.20]dataSet-训练集labes-分类标签k-用于训练的参数选择距离最小的K个点返回数据sortedClassCount[0][0]-分类结果"""def classify(inX,dataSet,lables,k):#训练集的个数行dataSize = dataSet.shape[0]#测试数据与训练集计算距离差#tile让数组以某种方式重复4次深度1diffMat = np.tile(inX,(dataSize,1))-dataSet#二维数据平方sqDiffMat = diffMat**2#sum()所有元素相加,sum(0)列相加,sum(1)行相加而当加入axis=1以后就是将一个矩阵的每一行向量相加sqDistances = sqDiffMat.sum(axis=1)#最后算出距离DD = sqDistances**0.5#测试数据与训练集之间的所有距离 并且按照距离最短排序 ,取出索引 索引与lables一一对应sortedDistIndices = D.argsort()#记录类别次数字典classcount = {}for i in range(k):#取出前K个元素类别Vlabel = lables[sortedDistIndices[i]]print (Vlabel)classcount[Vlabel] = classcount.get(Vlabel,0)+1# python3中用items()替换python2中的iteritems()# key=operator.itemgetter(1)根据字典的值进行排序# key=operator.itemgetter(0)根据字典的键进行排序# reverse降序排序字典sortClassCount = sorted(classcount.items(),key=operator.itemgetter(1),reverse=True)print (classcount)print (sortClassCount)return sortClassCount[0][0]if __name__ == '__main__':#创建数据集group, labels = createDataSet()#测试集test = [2.60,3.40,2.75]#kNN分类test_class = classify(test, group, labels, 3)#打印分类结果print(test_class)
此方法没有对数据进行训练
k-近邻算法的一般流程:
收集数据:可以使用爬虫进行数据的收集,也可以使用第三方提供的免费或收费的数据。一般来讲,数据放在txt文本文件中,按照一定的格式进行存储,便于解析及处理。准备数据:使用Python解析、预处理数据。分析数据:可以使用很多方法对数据进行分析,例如使用Matplotlib将数据可视化。测试算法:计算错误率。使用算法:错误率在可接受范围内,就可以运行k-近邻算法进行分类。
已经了解了k-近邻算法的一般流程,下面开始进入实战内容。
-
数字识别
文件预处理将图片转换成32*32的大小,然后转换为01二进制文本图像
#图片大小转换def size():image=cv2.imread('26.png')res=cv2.resize(image,(32,32),interpolation=cv2.INTER_CUBIC)cv2.imshow('iker',res)cv2.imshow('image',image)cv2.imwrite('test.png', res) # 写入图片#cv2.destroyAllWindows() # 关闭窗口cv2.waitKey(0)#变成32*32的二进制图def changeTu():im = Image.open('test.png')width = im.size[0]height = im.size[1]fh = open('10_1.txt','w')for i in range(height):for j in range(width):color = im.getpixel((j,i))print(color)colorsum = color[0]+color[1]+color[2]print(colorsum)if(colorsum == 0):fh.write('1')else:fh.write('0')fh.write('\n')fh.close()#改变成向量def img2vector(filename):#创建1x1024零向量returnVect = np.zeros((1, 1024))#打开文件fr = open(filename)#按行读取for i in range(32):#读一行数据lineStr = fr.readline()#每一行的前32个元素依次添加到returnVect中for j in range(32):returnVect[0, 32*i+j] = int(lineStr[j])#返回转换后的1x1024向量return returnVect
分类器KNN
```python def classify0(inX, dataSet, labels, k):
numpy函数shape[0]返回dataSet的行数
dataSetSize = dataSet.shape[0]
在列向量方向上重复inX共1次(横向),行向量方向上重复inX共dataSetSize次(纵向)
diffMat = np.tile(inX, (dataSetSize, 1)) - dataSet
二维特征相减后平方
sqDiffMat = diffMat**2
sum()所有元素相加,sum(0)列相加,sum(1)行相加
sqDistances = sqDiffMat.sum(axis=1)
开方,计算出距离
distances = sqDistances**0.5
返回distances中元素从小到大排序后的索引值
sortedDistIndices = distances.argsort()
定一个记录类别次数的字典
classCount = {} for i in range(k):
#取出前k个元素的类别voteIlabel = labels[sortedDistIndices[i]]#dict.get(key,default=None),字典的get()方法,返回指定键的值,如果值不在字典中返回默认值。#计算类别次数classCount[voteIlabel] = classCount.get(voteIlabel,0) + 1
python3中用items()替换python2中的iteritems()
key=operator.itemgetter(1)根据字典的值进行排序
key=operator.itemgetter(0)根据字典的键进行排序
reverse降序排序字典
sortedClassCount = sorted(classCount.items(),key=operator.itemgetter(1),reverse=True)
返回次数最多的类别,即所要分类的类别
return sortedClassCount[0][0]
```
