- 标签需要人工大量时间去标注。
- 监督学习:标签,分类
- 非监督学习:没有标签,聚类(相似数据归类)
- 半监督学习: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 np
import 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次深度1
diffMat = np.tile(inX,(dataSize,1))-dataSet
#二维数据平方
sqDiffMat = diffMat**2
#sum()所有元素相加,sum(0)列相加,sum(1)行相加而当加入axis=1以后就是将一个矩阵的每一行向量相加
sqDistances = sqDiffMat.sum(axis=1)
#最后算出距离D
D = 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]
```