K-means和KNN

非监督学习

给机器输入大量特征数据,并期望机器通过学习找到数据中存在的某种共性特征或者结构,抑或是数据之间存在的某种关联。非监督学习问题不是像监督学习那样希望预测某种输出结果。相比于监督学习,非监督学习的输入数据没有标签信息,需要通过算法模型来挖掘数据内在的结构和模式。

聚类

在事先并不知道任何样本标签的情况下,通过数据之间内在关系把样本划分为若干类别,使得同类别样本之间的相似度高,不同类别之间的样本相似度低。

K-means

属于非监督学习

非监督学习

  1. 特点:输入数据没有标签信息,需要通过算法模型来挖掘数据内在的结构和模式
  2. 主要包括:数据聚类特征变量关联
  3. 数据聚类:通过多次迭代来找到数据的最优分割
  4. 特征变量关联:利用各种相关性分析方法来找到变量之间的关系
  5. 分类问题(如支持向量机、逻辑回归、决策树等)属于监督学习,而聚类是非监督学习

K均值聚类(K-Means)

  1. 最基本和最常用的聚类算法
  2. 基本思想:通过迭代方式寻找K个簇的一种划分方案,使得聚类结果对应的代价函数最小。
  3. 代价函数:各个样本距离所属簇中心点的误差平方和

在这里插入图片描述

  1. 步骤
    核心目标:将给定的数据集划分成K个簇,并给出每个数据对应的簇中心点。
    1)数据预处理,如归一化,离群点处理等
    2)随机选取K个簇中心
    3)定义代价函数
    在这里插入图片描述
    4)迭代下面过程,重复直到J收敛(首先固定簇中心,调整每个样例所属的类别让J减少;然后固定类别,调整簇中心,使J减小。两个过程交替循环
    在这里插入图片描述

缺点:

  1. 初值和离群点影响每次结果不稳定,易受噪声点的影响
  2. 结果通常不是全局最优,而是局部最优,效果受初始值影响很大
  3. 无法很好的解决数据簇分布差别比较大的情况(比如一类是另一类样本数量的100倍)
  4. 不太适用于离散分类
  5. 需要人工预先确定初始K值,且该值和真实的数据分布未必吻合
  6. 样本点只能被划分到单一的类中

优点:

  1. 对于大数据集,K均值聚类算法相对是可伸缩和高效的,计算复杂度O(NKt)接近于线性
  2. 尽管算法经常以局部最优结束,但一般情况下达到的局部最优已经可以满足需求

调优

  1. 数据归一化和离群点处理
  2. 合理选择K值(手肘法):
    尝试不同的K值,并将不同K值所对应的损失函数画成折线,拐点就是K的最佳值,但该方法不够自动(如图,K值越大,距离和越小)
    在这里插入图片描述
    Gap Statistic方法:
    优点:不需要肉眼判断,只需要找到最大的Gap Statistic所对应的K即可,因此该方法也适用于批量化作业。
    原理:
    当分为K簇时,对应的损失函数记为Dk,Gap statistic定义为:
    在这里插入图片描述
    其中,E(logDk)是logDk的期望,一般通过蒙特卡洛模拟产生。
    蒙特卡洛模拟:
    在样本所在的区域内按照均匀分布随机产生和原始样本数一样多的随机样本,并对这个随机样本做K均值,得到一个Dk,多次重复即可得到E(logDk)的近似值。
    Gap(K)的物理含义:随机样本的损失与实际样本的损失之差。
  3. 采用核函数
    数据为非凸时,引入核函数优化,又称为核K均值算法。核聚类方法的主要思想是通过一个非线性映射, 将输入空间中的数据点映射到**高位的特征空间中,并在新的特征空间中进行聚类。**非线性映射增加了数据点线性可分的概率,从而在经典的聚类算法失效的情况下,通过引入核函数可以达到更为准确的聚类结果。

改进的模型:

K-means++算法

改进地方:对初始值选择的改进。
方法:假设已经选取了n个初始聚类中心(0<n<k),则在选取第n+1个聚类中心时,距离当前n个聚类中心越远的点会有更高的的概率被选为第n+1个聚类中心。在选取第一个聚类中心时通过随机的方法。

ISODATA算法(迭代自组织数据分析法)

改进地方:确定K值,在K均值算法的基础上增加了“分裂操作”:增加聚类中心数,和“合并操作”:减少聚类中心数
方法:
当属于某个类别的样本数过少时,把该类别去除;当属于某个类别的样本数过多,分散程度过大时,把该类别分成两个子类别。
缺点:参数较多
ISODATA输入参数:
预期的聚类中心数目K0,最终的输出聚类中心数目变动范围(1/2*k0 ~ 2 *k0)
每个类所要求的最少样本数目:Nmin
最大方差Sigma:用于控制某个类别中样本的分散程度
两个聚类中心之间多允许的最小距离Dmin

k近邻学习(KNN):监督学习、懒惰学习

  1. 优点:既**可作分类又可作回归,**无需估计参数,无需训练。针对数据量不大的情况,可采用KNN做推荐算法。
  2. 缺点:计算量比较大,分析速度较慢,对于样本分布不均衡问题不太好用,也无法给出数据的内在含义,是一种懒散学习法。
  3. 方法:给定测试样本,居于某种距离度量找出训练集中与其最靠近的k个训练样本,然后基于这k个“邻居”的信息来进行预测。
  4. 在分类任务中,可使用“投票法”,即选择这k个样本中出现最多的类别作为预测结果
  5. 回归任务中,“平均法”,即将这k个样本的实值输出标记的平均值作为预测结果
  6. 特点:无显式的训练过程
  7. 举例:
    在这里插入图片描述
    有两类不同的样本数据,分别用蓝色的正方形和红色得三角形表示,而中间的绿色圆表示待分类数据,根据K近邻思想给绿色园点分类:
    1)若k=3,绿色圆点最近邻的3个点是2个红色三角形和1个蓝色小正方形,少数服从多数,基于统计的方法,判定这个绿色的待分类点属于红色三角形。
    2)若k=5,绿色圆点最近邻的5个点是2个红色三角形和3个蓝色小正方形,少数服从多数,基于统计的方法,判定这个待分类点属于蓝色的正方形。
    算法思想:找离它最近的k个实例,哪个类别最多即可
    8**. 步骤:**
    1)计算待分类物体与其他物体之间的距离;
    2)统计距离最近的K个邻居
    3)对于K个最近的邻居,他们属于哪个分类最多,待分类物体就属于哪一类
  8. 问题:
    1)怎么度量距离,锁定最近的K个邻居?
    2)怎么确定K值?
  9. K值选择:
    在这里插入图片描述
    在这里插入图片描述
    一般选择交叉验证的方式选取K值:
    把样本集中的大部分样本作为训练集,剩余的小部分样本用于预测,来验证分类模型的准确性。所以在KNN算法中,一般把K值选取在较小的范围内,同时在验证集上准确率最高的那一个最终确定作为K值
  10. 距离计算
    两个样本之间的距离代表了这两个样本之间的相似度。距离越大,差异性越大;距离越小,相似性越大。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  11. 分类和回归:
    1)如果想要对未知电影进行类型划分,这是一个分类问题。首先看一下要分类的未知电影,离他最近的K部电影大多数属于哪个分类,这部电影就属于哪个分类。
    2)如果是一部新电影,已知她是爱情片,想要知道它的打斗次数、接吻次数可能是多少,这就是一个回归问题。
    在这里插入图片描述
import numpy as np
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import MinMaxScaler, StandardScaler
from sklearn.datasets import load_digits
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import AdaBoostClassifier
from sklearn.svm import SVC
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import accuracy_score

digits = load_digits()
data = digits.data
target = digits.target
## 数据扩增
data1 = np.vstack((data, data, data))
target1 = np.hstack((target, target, target))

print(data.shape)  # (1797, 64)
print(digits.images[0].shape) # 8 * 8
print(digits.target[0]) # 0

plt.gray()
plt.imshow(digits.images[0])
plt.show()


train_x, test_x, train_y, test_y = train_test_split(data, target,
                                                    test_size=0.25)
print(train_y.shape)
# 采用z-score规范化
ss = StandardScaler()
train_ss_scaled = ss.fit_transform(train_x)
test_ss_scaled = ss.fit_transform(test_x)

# 采用0-1归一化
mm = MinMaxScaler()
train_mm_scaled = mm.fit_transform(train_x)
test_mm_scaled = mm.fit_transform(test_x)
'''
这里之所以用了0-1归一化,是因为多项式朴素贝叶斯分类这个模型,传入的数据不能有负数。
因为 Z-Score 会将数值规范化为一个标准的正态分布,即均值为 0,方差为 1,数值会包含负数。
因此我们需要采用 Min-Max 规范化,将数据规范化到[0,1]范围内。
'''
models={}
models['knn'] = KNeighborsClassifier()
models['svm'] = SVC()
models['tree'] = DecisionTreeClassifier()
models['ada'] = AdaBoostClassifier(base_estimator=models['tree'], learning_rate=0.1)

for model_key in models.keys():
    if model_key == 'knn' or model_key == 'svm' or model_key == 'ada':
        model = models[model_key]
        model.fit(train_ss_scaled, train_y)
        predict = model.predict(test_ss_scaled)
        print(model_key, '准确率:', accuracy_score(test_y, predict))
    else:
        model = models[model_key]
        model.fit(train_mm_scaled, train_y)
        predict = model.predict(test_mm_scaled)
        print(model_key, '准确率:', accuracy_score(test_y, predict))




在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值