import cv2 # # # 读取图像 # image = cv2.imread('D:\study pic\down.jpg') # 替换为你的图像文件路径 # # # 获取原始图像的尺寸 # height, width = image.shape[:2] # # # 计算新的尺寸,这里我们将其缩小到原来的一半 # new_width = int(width / 2) # new_height = int(height / 2) # # # 使用cv2.resize()函数缩小图像 # resized_image = cv2.resize(image, (new_width, new_height)) # # # 显示原始图像和缩小后的图像 # cv2.imshow('Original Image', image) # cv2.imshow('Resized Image', resized_image) # # # 等待按键事件 # cv2.waitKey(0) # cv2.destroyAllWindows()
当你使用cv2.imread()
函数从文件中加载一幅图像后,得到的image
变量实际上是一个NumPy数组,它表示图像的数据。这个数组具有多个维度,具体取决于图像的颜色通道数。对于彩色图像来说,通常有三个维度:高度、宽度和颜色通道数。对于灰度图像,则只有两个维度:高度和宽度。
image.shape
返回一个元组,表示图像的尺寸。对于彩色图像,元组包含三个值:高度 (height)、宽度 (width) 和通道数 (channels)。对于灰度图像,元组只包含两个值:高度 (height) 和宽度 (width)。
当你调用image.shape[:2]
时,你正在使用Python的切片操作来获取前两个元素,即高度和宽度。这里是一个具体的例子:
- 如果
image
是一个彩色图像,image.shape
将返回一个形如(height, width, channels)
的元组。 - 如果
image
是一个灰度图像,image.shape
将返回一个形如(height, width)
的元组。
在这两种情况下,image.shape[:2]
都会返回一个形如(height, width)
的元组,因为切片操作从元组的开始位置取到第二个位置(不包括第二个位置),所以无论是否存在第三个元素(颜色通道数),你总是可以安全地获取高度和宽度。
import cv2 import numpy as np # 读取图像 image_path = r'D:\study pic\child.jpeg' image = cv2.imread(image_path) # 检查是否成功读取图像 if image is None: print("Could not read the image.") else: # 获取图像尺寸 height, width = image.shape[:2] # 定义旋转中心(这里是图像的中心) center = (width / 2, height / 2) # 定义旋转角度和缩放比例 angle = 45 # 旋转45度 scale = 1.0 # 缩放比例为1.0,即保持原大小 # 获取旋转矩阵 rotation_matrix = cv2.getRotationMatrix2D(center, angle, scale) # 应用仿射变换 rotated_image = cv2.warpAffine(image, rotation_matrix, (width, height)) # 显示原图和旋转后的图像 cv2.imshow('Original Image', image) cv2.imshow('Rotated Image', rotated_image)
rotation_matrix = cv2.getRotationMatrix2D(center, angle, scale)
rotated_image = cv2.warpAffine(image, rotation_matrix, (width, height))
第一行代码:rotation_matrix = cv2.getRotationMatrix2D(center, angle, scale)
cv2.getRotationMatrix2D
是 OpenCV 中的一个函数,用于计算旋转矩阵。center
是一个元组,表示图像旋转的中心点坐标,通常为(x, y)
形式,其中x
和y
分别是图像宽度和高度的一半。angle
是一个整数或者浮点数,表示图像旋转的角度(逆时针方向)。scale
是一个浮点数,表示旋转后图像的缩放比例。值为 1 表示不缩放,小于 1 则表示缩小,大于 1 则表示放大。
这个函数会返回一个 2x3 的仿射变换矩阵,形式如下:
[cosθ−sinθ(1−cosθ)⋅x−sinθ⋅ysinθcosθsinθ⋅x+(1−cosθ)⋅y][cosθsinθ−sinθcosθ(1−cosθ)⋅x−sinθ⋅ysinθ⋅x+(1−cosθ)⋅y]
这里 θ
是旋转的角度,而 x
和 y
是旋转中心的坐标。
第二行代码:rotated_image = cv2.warpAffine(image, rotation_matrix, (width, height))
cv2.warpAffine
是 OpenCV 中的一个函数,用于应用仿射变换矩阵到图像上。image
是原始图像数据。rotation_matrix
是通过cv2.getRotationMatrix2D
函数得到的旋转矩阵。(width, height)
是输出图像的尺寸。
学习了python的第七章input()和while: ez,和c差不多。
聚类是一种无监督学习技术,它的目标是将相似的数据对象分组在一起形成“簇”。简单来说,聚类就像是把相似的东西归为一类。
假设空间是指机器学习算法在解决问题时所能产生的所有可能的解决方案的集合。简单来说,假设空间就像是一个巨大的仓库,里面存放着所有可能的模型或预测规则。
想象一下,你要教一个孩子如何区分狗和猫。你给孩子看了一些狗和猫的照片,并告诉他哪些是狗,哪些是猫。现在,孩子需要学会一个规则,能够区分新的照片中的狗和猫。
假设空间就像是孩子脑海里所有可能的学习规则的集合。例如,孩子可能会想到这样的规则:
- 如果动物有长尾巴,那就是猫。
- 如果动物的耳朵尖尖的,那就是狗。
- 如果动物的毛发很长,那就是猫。
- ...
这些规则就是假设空间的一部分。孩子需要从中选择一个最好的规则来区分狗和猫
归纳偏好是在机器学习中用来描述算法如何从有限的训练数据中学习到一般规律的概念。简单来说,归纳偏好就像是给算法设定的一些基本原则或假设,帮助算法更好地理解和预测未知的情况。
举例说明
想象一下,你是一位侦探,正在解决一起案件。你手头有一些线索,但并不是所有情况都已知。为了找出真相,你需要根据现有的线索作出一些合理的假设或推断。
类比解释
-
假设你发现了一串脚印:这是你有的线索之一。你不能仅仅依靠这串脚印来确定嫌疑人是谁,因为你不知道世界上所有人的脚印。但是,你可以做一些合理的假设:
- 假设1:脚印指向的方向可能是嫌疑人逃跑的方向。
- 假设2:脚印的大小可能与嫌疑人的身高相关联。
-
你看到脚印是向北走的:这是一个具体的线索。根据这个线索和你的假设,你可以推断嫌疑人可能朝北逃跑了。
-
你注意到脚印很大:这又是一个线索。结合你的假设,你可能认为嫌疑人个子比较高。
这些假设(假设1和假设2)就是归纳偏好的例子。它们帮助你从有限的信息中得出更广泛的结论。
NFL定理,全称为"No Free Lunch"定理,直译为“没有免费午餐定理”,这是机器学习和优化领域的一个重要概念。简单来说,这个定理告诉我们,在所有可能的问题中,没有任何一种算法能够在所有问题上都表现得最好。
过拟合是指模型在训练数据上表现得非常好,但在新的、未见过的数据(如测试数据)上表现较差的情况。换句话说,模型过于复杂,以至于它不仅学习到了数据中的有用模式,还学习到了数据中的噪声或随机波动。
欠拟合是指模型在训练数据和新的数据上表现都很差的情况。这意味着模型没有足够地学习数据中的模式,过于简单,无法捕捉到数据中的关键信息。
留出法是最简单的数据划分方法之一,其主要思想是将数据集分成两个部分:一部分用于训练模型,另一部分用于测试模型的性能。
优点:
- 实现简单。
- 计算成本较低。
缺点:
- 结果可能受数据划分的影响较大。
- 如果数据集较小,划分可能不够均匀,导致评估结果不可靠。
交叉验证法是一种评估模型性能的方法,它通过将数据集分成几个相等的部分来进行多次训练和测试,以减少留出法中可能出现的偏差。
如何操作?
- 划分数据:将数据集分成k个相等的部分(称为“折”)。
- 进行k轮验证:
- 每轮选择其中一个部分作为测试集,其余的部分组成训练集。
- 在训练集上训练模型,并在测试集上评估模型性能。
- 汇总结果:计算k轮验证的平均性能指标。
- 可以更准确地评估模型的性能。
- 减少了数据划分对结果的影响。
- 计算成本较高,因为需要进行多次训练和测试。
- 对于大规模数据集来说,计算开销可能会变得非常高。
留一法(Leave-One-Out,简称LOO)是一种交叉验证的技术,用于评估机器学习模型的性能。它的基本思想是:每次选择一个样本作为测试集,其余的所有样本作为训练集,然后用训练好的模型来预测这个单一样本的结果。这个过程会重复多次,每次选择不同的单一样本作为测试集,直到所有的样本都被用作一次测试集为止。
自助法是一种统计学方法,用于估计数据的分布特性,特别适用于数据量较小的情况。在机器学习中,自助法常用于创建多个不同的训练集来评估模型的稳定性。
如何操作?
- 随机采样:从原始数据集中随机抽取n个样本(通常与原始数据集大小相同),允许重复抽取。
- 构建训练集:使用抽取出的样本构成一个训练集。
- 训练模型:在训练集上训练模型。
- 评估模型:使用未被选中的样本作为测试集来评估模型的性能。
- 重复步骤1-4:多次重复以上步骤,每次使用不同的随机抽样结果。
优点:
- 可以估计模型的稳定性。
- 对于小数据集尤其有用。
缺点:
- 计算成本较高,因为需要多次训练和测试。
- 抽样可能导致数据分布不均匀。
验证集是在机器学习和深度学习项目中经常使用的一个数据子集,它主要用于调整模型的超参数和选择最佳模型架构。简单来说,验证集是用来帮助我们在训练过程中决定模型是否过拟合(过于复杂以至于只记住训练数据而无法泛化到新数据)或欠拟合(模型太简单,无法捕捉数据中的模式)。
验证集(Validation Set)
- 用途:用于调整模型的超参数和选择模型。
- 作用:帮助评估模型在未见过的数据上的表现,并防止过拟合。
- 目标:通过验证集来选择最佳模型配置,调整如学习率、层数、隐藏单元数量等超参数。
示例说明
想象一下,你是一位厨师,正在准备一道新菜。
- 训练集就像是一批食材,你用这些食材来练习做这道菜,通过不断尝试来学习如何制作。
- 验证集就像是你邀请了几位朋友来品尝你做的菜,根据他们的反馈来调整食谱,比如加盐或减糖。
- 测试集就像是你最终将这道菜端给顾客品尝,看看这道菜是否符合大众的口味。
训练集用于学习和调整模型的基本参数。
验证集用于调整模型的超参数,并帮助选择最佳模型。
测试集用于评估模型的最终性能,确保模型能够很好地应对新的数据
混淆矩阵是一种表格形式的报告,用于评估分类模型的性能。它展示了模型预测结果与实际结果之间的对比情况。混淆矩阵可以帮助我们直观地了解模型在哪种类型的预测上表现好,在哪种类型上表现不佳。
二分类混淆矩阵是最常见的一种混淆矩阵,用于二分类问题。它通常涉及两类:正类(Positive)和负类(Negative)。二分类混淆矩阵通常包含四个主要部分:
- 真正例(True Positives, TP):模型正确地预测了正类。
- 真负例(True Negatives, TN):模型正确地预测了负类。
- 假正例(False Positives, FP):模型错误地将负类预测为正类。(以为是正类)
- 假负例(False Negatives, FN):模型错误地将正类预测为负类。(以为是负类)
准=1/(1+3):分母以预测为正类的集合(个人理解)
全=1/(1+4):分母以实际为正类的集合
真正例(TP):你诊断病人确实患病,而实际上病人确实患病。
真负例(TN):你诊断病人未患病,而实际上病人确实未患病。
假正例(FP):你诊断病人患病,但实际上病人并未患病(误诊)。(我以为你病的)
假负例(FN):你诊断病人未患病,但实际上病人确实患病(漏诊)。(我以为你没病)
查准率计算公式如下: Precision=真正例 (TP)/(真正例 (TP)+假正例 (FP))
查全率计算公式如下: Recall=真正例 (TP)/(真正例 (TP)+假负例 (FN))
F1分数是一种综合评价指标,用于评估分类模型的性能。它是查准率(Precision)和查全率(Recall)的调和平均值。F1分数提供了一个单一的数值,用来衡量模型在精确性和完整性方面的整体表现。