目录
欢迎大家订阅我的专栏一起学习共同进步,主要针对25届应届毕业生
祝大家早日拿到offer! let's go
算法类别 | 优点 | 缺点 |
Bayes | 1) 所需估计的参数少,对于缺失数据不敏感 | 1)需要假设属性之间相互独立,这往往并不成立(喜欢吃番茄、鸡蛋,却不喜欢吃番茄炒蛋) |
SVM | 1)可以解决小样本下机器学习的问题 | 1)对缺失数据敏感 |
KNN | 1)思想简单,理论成熟,既可以用来做分类也可以用来做回归 | 1)计算量太大 |
Logistic Regression | 1)速度快 | 1)特征处理复杂,需要归一化和较多的特征工程 |
Neural Network | 1)分类准确率高 | 1)需要大量参数(网络拓扑、阀值、阈值) |
假设我们正在开发一个模型来诊断罕见疾病。在这种情况下,罕见疾病的发病率可能非常低,例如仅占所有病例的百分之一。因此,我们的数据集中会有大量的健康样本(类别0),而罕见疾病的样本数量相对较少(类别1)。
现在假设我们开发了一个简单的模型,该模型倾向于将所有样本都预测为健康(类别0),因为这样可以获得很高的整体准确率。然而,对于罕见疾病的样本,这样的模型将无法提供有效的诊断,因为它几乎总是预测为健康。
在这种情况下,我们需要采取措施来解决数据不平衡问题,确保模型能够在诊断罕见疾病时具有良好的性能。我们可以使用类似于前面提到的解决方案,例如重采样、类别权重调整、使用不同的评价指标等来处理数据不平衡。
出现这种现象的原因主要是数据分布不均衡,类别为1的数据太少,错分了类别1但达到很高的正确率,此时失效。
在确保一定正确率前提下,要求分类器的召回率尽量高。
什么是聚类:
主要可划分为:
K-means 聚类流程:
初始点随机分布
k-means++方法:在一开始确定簇时,让所有簇中心坐标两两距离最远
聚的是特征。
K-means与K-means++:原始K-means算法最开始随机选取数据集中K个点作为聚类中心,而K-means++按照如下的思想选取K个聚类中心:假设已经选取了n个初始聚类中心(0
k-means code:
- import numpy as np
-
- np.random.seed(545)
-
- def wh_iou(wh1, wh2):
- # 返回nxm的IoU矩阵。wh1是nx2的数组,wh2是mx2的数组
- wh1 = wh1[:, None] # [N,1,2]
- # 通过添加维度将输入的边界框数组 wh1 和 wh2 转换为三维数组
- wh2 = wh2[None] # [1,M,2]
- inter = np.minimum(wh1, wh2).prod(2) # [N,M]
- # 这一行代码计算了交集部分的面积。它首先对 wh1 和 wh2 中的对应元素进行逐元素的最小值计算,然后对第二个维度进行乘积运算。
- return inter / (wh1.prod(2) + wh2.prod(2) - inter) # iou = inter / (area1 + area2 - inter)
- # wh1.prod(2) 和 wh2.prod(2) 计算了 wh1 和 wh2 中每个边界框的面积
-
- def k_means(boxes, k, dist=np.median):
- """
- YOLO的k-means聚类方法
- 参考: https://github.com/qqwweee/keras-yolo3/blob/master/kmeans.py
- 参数:
- boxes: 需要进行聚类的边界框
- k: 聚类中心的数量
- dist: 更新聚类中心的方法(默认为中位数,效果略优于均值)
- """
- box_number = boxes.shape[0]
- last_nearest = np.zeros((box_number,))
- # 创建一个长度为 box_number 的零数组,用于存储上一次迭代时每个边界框所属的最近的聚类中心的索引。在算法的每次迭代中,都会将当前迭代的结果与上一次迭代的结果进行比较,以判断是否达到了收敛条件,从而决定是否终止迭代。
- # 随机选择k个边界框作为初始聚类中心
- clusters = boxes[np.random.choice(box_number, k, replace=False)] # replace 不重复的选取
- print((clusters))
-
- while True:
- # 计算每个边界框到每个聚类中心的距离: 1-IOU(边界框, 聚类中心)
- distances = 1 - wh_iou(boxes, clusters)
- # 找到每个边界框最近的聚类中心
- current_nearest = np.argmin(distances, axis=1)
- # 如果聚类结果不再变化,则退出循环(收敛)
- if (last_nearest == current_nearest).all():
- break
- # 根据每个聚类中的边界框更新聚类中心
- for cluster in range(k):
- clusters[cluster] = dist(boxes[current_nearest == cluster], axis=0)
-
- last_nearest = current_nearest
-
- return clusters
-
- if __name__ == '__main__':
-
- boxes = np.array([[10, 20],
- [15, 25],
- [30, 35],
- [40, 45],
- [50, 55],
- [60, 65]])
-
- # Number of clusters
- k = 2
-
- # Call k_means function
- clusters = k_means(boxes, k)
- print("Cluster centers:\n", clusters)