Fisher算法&SVM&K-Means及其优化
fisher
算法及其实现
- 请实现
fisher
算法,并采用自己随机生成2类数据(每类100个)的方式,验证自己的算法。
参考资料:https://blog.csdn.net/pengjian444/article/details/71138003
数据生成
from sklearn.datasets import make_multilabel_classification |
make_multilabel_classification方法参数说明n_samples
:样本的数量。n_features
:样本的特征,这里是在二维平面中的点,所以为2.n_labels
:每个实例的平均标签数。n_classes
:分类问题的分类数。random_state
:设置随机数种子,保证每次产生相同的数据。
enumerate()函数说明enumerate()
函数用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中。
fisher算法实现
def cal_cov_and_avg(samples): |
np.mean
:计算制定轴上的平均值。np.zeros
:给定形状和类型确定的数组,并用0填充。
判定类别
def judge(sample, w, c_1, c_2): |
绘图
import matplotlib.pyplot as plt |
<Figure size 640x480 with 1 Axes>
SVM
优化对偶问题的详细推导过程
- 请给出
SVM
优化对偶问题的详细推导过程;并给出只有2维特征情况下的,对偶问题的优化求解过程(可以采用lagrange
方法,也可以采用其他方法。)
参考资料:https://zhuanlan.zhihu.com/p/49331510
SVM
算法的实现
- 请实现
SVM
算法;并采用自己随机生成2类线性可分数据(每类100个)的方式验证自己的算法。
参考资料:https://www.jb51.net/article/131580.htm
from sklearn import svm |
W: [0.95070185 1.15607502]
a: -0.8223530762163854
support_vectors_: [[-0.51174781 -0.10411082]
[ 0.16323595 -0.66347205]
[ 2.39904635 -0.77259276]
[ 0.66574153 0.65328249]
[-0.25556423 0.97749316]]
clf.coef_: [[0.95070185 1.15607502]]
k-means
算法的实现
- 请实现
k-means
的算法;并采用自己随机生成3类数据(每类100个)的方式,验证自己的算法。
参考资料1:https://cloud.tencent.com/developer/article/1465020
参考资料2:https://blog.csdn.net/weixin_42029738/article/details/81978038
''' |
K-Means clustering algorithms
k-means
算法的改进
- 请给出三种
k-means
算法在大数据量时的改进方法,并分析改进的结果。
改进方法包括:k-means++
(改变中心点的选取方法)elkan K-Means
(减少不必要的距离计算)ISODATA
算法(在运行过程中根据实际情况调整聚类中心数k)Mini Batch k-means
算法(采用部分样本,舍弃一些精确度大大加快收敛速度)
其中1和4改进方法给出了源码和对比。
k-means++
(改变中心点的选择方法)
参考资料1:https://blog.csdn.net/github_39261590/article/details/76910689
参考资料2:https://www.cnblogs.com/yszd/p/9672885.htmlk-means++
算法选择初始seeds的基本思想就是:初始的聚类中心之间的相互距离要尽可能的远。
算法步骤:
- 从输入的数据点集合中随机选择一个点作为第一个聚类中心
- 对于数据集中的每一个点x,计算它与最近聚类中心(指已选择的聚类中心)的距离D(x)
- 选择一个新的数据点作为新的聚类中心,选择的原则是:D(x)较大的点,被选取作为聚类中心的概率较大
- 重复2和3直到k个聚类中心被选出来
- 利用这k个初始的聚类中心来运行标准的k-means算法
import numpy as np |
elkan k-means
算法
参考资料:https://blog.csdn.net/u014465639/article/details/71342072elkan K-Means
利用了两边之和大于等于第三边,以及两边之差小于第三边的三角形性质,来减少距离的计算。
第一种规律是对于一个样本点和两个质心。如果我们预先计算出了这两个质心之间的距离,则如果计算发现,我们立即就可以知道。此时我们不需要再计算,也就是说省了一步距离计算。
第二种规律是对于一个样本点和两个质心。我们可以得到。这个从三角形的性质也很容易得到。
利用上边的两个规律,elkan K-Means比起传统的K-Means迭代速度有很大的提高。但是如果我们的样本的特征是稀疏的,有缺失值的话,这个方法就不使用了,此时某些距离无法计算,则不能使用该算法。
ISODATA
算法
参考资料1:https://blog.csdn.net/houston11235/article/details/8511379
参考资料2:https://www.cnblogs.com/huadongw/p/4101422.html
k-means 的一个缺点就是必须指定聚类的个数,这个有些时候并不太行得通。于是就要求最好这个类别的个数也可以改变,这就形成了 isodata 方法,通过设定一些类别分裂和合并的条件,在聚类的过程中自动增减类别的数目。当然这也带来了一个问题,就是这个条件有时候并不那么好给出。当然 isodata 在很多情况下还是可以得到比较靠谱的结果。
Mini Batch k-means
(用一部分样本做传统的k-means,舍弃一部分精确度大大提高收敛速度)
参考资料1:https://cloud.tencent.com/developer/article/1465020
Mini Batch KMeans算法是一种能尽量保持聚类准确性下但能大幅度降低计算时间的聚类模型,采用小批量的数据子集减少计算时间,同时仍试图优化目标函数,这里所谓的Mini Batch是指每次训练算法时随机抽取的数据子集,采用这些随机选取的数据进行训练,大大的减少了计算的时间,减少的KMeans算法的收敛时间,但要比标准算法略差一点,建议当样本量大于一万做聚类时,就需要考虑选用Mini Batch KMeans算法。
''' |
Comparison of the K-Means and MiniBatchKMeans clustering algorithms