心得三

任务4

随着K值的增大,决策边界会变得更加平滑,决策边界的平滑也意味着模型的稳定性。但稳定不代表这个模型就会越准确。

 

np.random.multivariate_normal(): 从多元正态分布中随机抽取样本,将一维正态分布推广到更高维度的方法。这种分布由其均值和协方差矩阵指定。这些参数类似于一维正态分布的均值(平均值或“中心”)和方差(标准偏差或“宽度”的平方)

def multivariate_normal(mean, cov, size=None, check_valid=None, tol=None)

必传参数:mean,cov          可选参数:size,check_valid,tol

mean:多元正态分布的维度。(长度为N的一维数组)    

示例:mean = [0, 0]  # 1行2列的一维数组,numpy.ramdom.randn()可以生成一维矩阵

cov:多元正态分布的协方差矩阵,且协方差矩阵必须是对称矩阵和半正定矩阵(形状为(N,N)的二维数组)。

示例:cov = [[1. 0.],  [0. 1.]]  # 可以使用numpy.eye()生成对角矩阵。

参考:https://www.cnblogs.com/yangzepeng/p/10961480.html    https://www.cnblogs.com/ceo-python/p/11722864.html

 

shape()  以元组形式返回数组各个维度的元素个数

参考:https://www.jianshu.com/p/ea733194b2e0

 

fit()用于从训练数据生成学习模型参数

 

np.meshgrid()   生成网格点坐标矩阵

参考:https://blog.csdn.net/lllxxq141592654/article/details/81532855

 

np.arange([start, ]stop, [step, ]dtype=None) 返回一个有终点和起点的固定步长的排列

start:可忽略不写,默认从0开始;起始值

stop:结束值;生成的元素不包括结束值

step:可忽略不写,默认步长为1

步长 dtype:默认为None,设置显示元素的数据类型

参考:https://www.jianshu.com/p/d7d3ae1f096f     https://blog.csdn.net/qq_41550480/article/details/89390579 

 

决策边界的平滑也意味着模型的稳定性,但稳定不代表这个模型就会越准确 因此需要 选择一个平衡点——交叉验证

 

交叉验证 核心思想:把一些候选的K逐个去尝试一遍,选出效果最好的K值

常用的交叉验证技术----K折交叉验证(K-fold Cross Validation)  参考:https://blog.csdn.net/weixin_39183369/article/details/78953653(K折交叉验证法原理及python实现)

https://www.cnblogs.com/aibbtcom/p/8548491.html

简单交叉验证:数据都只被所用了一次,没有被充分利用      K折就是将数据集切分成K小块,验证集和测试集相互形成补集,循环交替

当数据量较少的时候取更大的K,因为数据量较少的时候,尽可能使用更多的数据来训练模型

KFold(n_splits=3, shuffle=False, random_state=None)

n_splits:表示划分几等份

shuffle:在每次划分时,是否进行洗牌

①若为Falses时,其效果等同于random_state等于整数,每次划分的结果相同

②若为True时,每次划分的结果都不一样,表示经过洗牌,随机取样的

random_state:随机种子数

 

kf.split(X) 返回的是X中进行分裂后traintest的索引值  参考:https://blog.csdn.net/cherdw/article/details/54986863

 

range() 函数返回的是一个可迭代对象(类型是对象),而不是列表类型,打印的时候不会打印列表

range(stop)

range(start, stop ,step)//默认start为0,step为1

例:

for i in range(5):
    print(i,end=" ")  #输出:[0 1 2 3 4]
print("\n")                 
#可以使用range(n,m)的形式就会产生n到m-1的内容。
for i in range(1,5):
    print(i,end=" ")   #输出:[1 2 3 4]
print("\n")
# range(n,m,step),,step默认为1,,n默认为0
for i in range(1,5,2):

    print(i,end=" ")    #输出:[1 3]

 

 

from sklearn.neighbors import KNeighborsClassifier   #导入sklearn.neighbors模块中KNN类

list() 函数是对象迭代器,可以把range()返回的可迭代对象转为一个列表,返回的变量类型为列表。用于将元组转换为列表

 

dict() 函数用于创建一个字典 参考:https://www.runoob.com/python/python-func-dict.html

 knn = KNeighborsClassifier()    #定义一个knn分类器对象         参考:https://www.cnblogs.com/xiaotan-code/p/6680438.html  https://blog.csdn.net/zfjBIT/article/details/87376974

clf = GridSearchCV(knn, param_gridknn, cv = 5)           //knn: 选择使用的分类器     param_gridknn:需要最优化的参数的取值,值为字典或者列表    cv: 交叉验证参数

 参考:https://blog.51cto.com/emily18/2088128?utm_source=oschina-app

 

特征规范化

不同属性具有不同量级时会导致:

①数量级的差异将导致量级较大的属性占据主导地位

②数量级的差异将导致迭代收敛速度减慢

③依赖于样本距离的算法对于数据的数量级非常敏感

因此使用标准化的操作:线性归一化:  把特征值的范围映射到[0,1]区间

                                       标准差归一化:把特征值映射到均值为0,标准差为1的正态分布

 

KNN在预测过程中需要循环所有的样本数据,复杂度线性依赖于样本数量,因此不适合大数据场景

 

任务5

 

图像属于非结构化数据,可以通过Python自带的库来读取,并把图片数据存放在矩阵(Matrix)或者张量(Tensor)里

一个像素点一般由三维数组来构成,分别代表的是R,G,B三种颜色,所以,一个大小为128*128像素的图片实际大小为128*128*3,是一个三维张量的形式

读取图片中的数据,并展示图片的内容:

import matplotlib.pyplot as plt
img=plt.imread('D:/机器学习/图/a.jpg')
print(img.shape)
plt.imshow(img)

输出:

       

如果直接读取图片里的数据再通过KNN算法来识别图片,但是KNN是计算两个矩阵/张量之间的距离,而不会考虑某些环境因素,如:物体的不同角度、图像的大小、物体被部分遮盖、亮度、同一个物体可以有不同的形状等

改进提升 =>   做图像上的特征工程: 研究如何从图片的原始特征里提取特征,而且这些特征可以很好地对图像做个总结,并且较好地处理不同环境带来的影响

常用的图片特征:

颜色特征——颜色直方图:对R,G,B三种颜色做一个统计,比如有百分之多少的R颜色落在[10,20]的区间

SIFT(Scale Invariant Feature Transform)尺度不变特征变换,一种局部特征,具有尺度不变性,SIFT试图去寻找类似图片中的拐点这类的关键点,然后通过一系列的处理得到一个SIFT向量(在空间尺度中寻找极值点,并提取出其位置、尺度、旋转不变量)  参考:https://blog.csdn.net/u010440456/article/details/81483145

HOG(HistogramoforientedGradient) 方向梯度直方图,通过计算和统计图像局部区域的梯度方向直方图来构成特征

 

对图片特征的降维   降维操作会更好地保留图片中重要的信息,同时也帮助过滤掉无用的噪声,节约计算机资源

1.特征提取

2.PCA(Principal Component Analysis),即主成分分析方法,主要思想是将n维特征映射到k维上,在空间里选择信息量最大的Top K维度作为新的特征值

 

任务6

np.unique() 对一维数组或列表,unique()函数去除其中重复元素,并按元素大小返回一个新的无重复元组或列表。 参考:https://www.cnblogs.com/keye/p/11168540.html

 

X_train[1][0:16] 参考:https://blog.csdn.net/u012768474/article/details/95066275

 

plt.subplot()  Matplotlib的可以把很多张图画到一个显示界面,这就涉及到面板切分成一个一个子图直接指定划分方式和位置进行绘图

一个figure对象包含了多个子图,图表的整个绘图区域被分成 numRows 行和 numCols 列,按照从左到右,从上到下的顺序对每个子区域进行编号,左上的子区域的编号为1。

可以使用subplot()函数来绘制子图:subplot(numbRow , numbCol ,plotNum ) or  subplot(numbRow numbCol plotNum)

numbRow是plot图的行数;numbCol是plot图的列数;plotNum是指第几行第几列的第几幅图,如果是subplot (2 ,2 ,1),那么这个figure就是个2*2的矩阵图,也就是总共有4个图,1就代表了第一幅图  参考:https://www.cnblogs.com/xiaoboge/p/9683056.html

 

np.where() 返回符合某一条件的下标

用法 参考:https://www.cnblogs.com/massquantity/p/8908859.html  https://blog.csdn.net/zs15321583801/article/details/79645685

np.where()[0] 表示行的索引;   np.where()[1] 则表示列的索引;

 

random.shuffle()   将序列的所有元素随机排序  参考:https://www.runoob.com/python3/python3-func-number-shuffle.html

 

GridSearchCV 网格搜索

自动调参,只要把参数输进去,就能给出最优化的结果和参数,但是这个方法适合于小数据集

class sklearn.model_selection.GridSearchCV(estimator, param_grid, scoring=None, fit_params=None, n_jobs=1, iid=True, refit=True, cv=None, verbose=0, pre_dispatch=‘2*n_jobs’, error_score=’raise’, return_train_score=’warn’)

estimator:选择使用的分类器,并且传入除需要确定最佳的参数之外的其他参数

param_grid:需要最优化的参数的取值,值为字典或者列表

n_jobs=1: 并行数

cv:交叉验证参数

posted @ 2020-01-06 17:25  小蔡不能菜  阅读(240)  评论(0编辑  收藏  举报