机器学习 Day16 聚类算法 ,数据降维

发布于:2025-05-15 ⋅ 阅读:(18) ⋅ 点赞:(0)

聚类算法

1.简介

1.1 聚类概念

  • 无监督学习:聚类是一种无监督学习算法,不需要预先标记的训练数据

  • 相似性分组:根据样本之间的相似性自动将样本归到不同类别

  • 相似度度量:常用欧式距离作为相似度计算方法

1.2 聚类vs分类

  • 聚类:无监督,不知道类别数量或含义,基于相似性分组

  • 分类:有监督,使用已标记数据训练模型预测新数据类别

2. K-means聚类实现

2.1 API介绍

from sklearn.cluster import KMeans

# 主要参数
KMeans(n_clusters=8)  # n_clusters指定聚类中心数量

# 常用方法
estimator.fit(x)      # 训练模型
estimator.predict(x)   # 预测类别
estimator.fit_predict(x)  # 训练+预测

2.2 代码实现步骤

1.创建数据集

from sklearn.datasets import make_blobs
import matplotlib.pyplot as plt

X, y = make_blobs(n_samples=1000, n_features=2, 
                  centers=[[-1,-1], [0,0], [1,1], [2,2]], 
                  cluster_std=[0.4, 0.2, 0.2, 0.2], 
                  random_state=9)

# 可视化
plt.scatter(X[:,0], X[:,1], marker='o')
plt.show()

2.聚类
from sklearn.cluster import KMeans

# 尝试不同聚类数量
y_pred = KMeans(n_clusters=2, random_state=9).fit_predict(X)

# 可视化结果
plt.scatter(X[:,0], X[:,1], c=y_pred)
plt.show()

3.聚类评估

from sklearn.metrics import calinski_harabasz_score

# 使用Calinski-Harabasz指数评估
print(calinski_harabasz_score(X, y_pred))

3.算法流程 

算法优化的是SSE,所以每一步都在把每个点分配到欧式距离最小的点。当然当优化的损失函数不同时,我们可以采取不同的距离。

K-means聚类步骤详解

  1. 初始化聚类中心

    • 随机选择(有改进)K个数据点作为初始聚类中心

    • 这些中心点位于特征空间内

  2. 分配数据点到最近中心

    • 对于每个数据点,计算它与所有K个中心的距离

    • 将该点分配到距离最近的聚类中心所属的簇

    • 常用距离度量:欧几里得距离(欧式距离)

  3. 重新计算聚类中心

    • 对每个簇,计算其中所有点的均值(每个特征维度的平均值)

    • 将均值点作为新的聚类中心

  4. 判断收敛

    • 比较新旧中心点的位置变化

    • 如果中心点不再移动(或移动小于阈值),算法终止

    • 否则,返回步骤2继续迭代

算法特点说明

  • 需要预先指定K值:这是算法的主要限制之一

  • 对初始中心敏感:不同的初始中心可能导致不同的最终结果

  • 对异常点敏感:涉及到求平均,异常点会产生误差很大。

  • 迭代过程保证收敛:算法一定会收敛,但可能只是局部最优

  • 适用于凸形数据分布:对非凸分布效果可能不佳

实际应用提示

  1. 可以通过多次运行取最优结果来缓解初始中心敏感问题

  2. 使用肘部法则(Elbow Method)或轮廓系数等方法帮助确定最佳K值

  3. 数据标准化很重要,因为K-means对特征的量纲敏感

4.算法评估:

4.1SSE(确定迭代次数)

 

就是计算每个簇中,每个点到中心点的距离平方,很明显当数据很多时,SSE计算会很计算量大、

4.2.肘方法(确定K)

4.3.轮廓系数(选择K)

a就是凝聚度,b就是分离度,我们希望高凝聚,高分离,也就是a小b大,所以那个公式就是SC越为一越好。但是,SC越1越好吗,我们在选择K的时候需要考虑希望使得样本不是很极端,比如

k=2的时候第一簇极度窄于第二簇,虽然它的SC小但是我们选择k=4.

4.4.C-H系数(选择K)

5.kmeans优缺点

6.Canopy算法

算法流程:

该算法之所以被称为预聚类,因为它的结果和选取的起始点可以作为以后的参考。 算法简而言之就是我先选一个点,在T1距离内视作这个类,在T2内我们不能再选出另一个起始点,然后选择一个随机点继续进行以上步骤。

优点解读

  • 抗干扰能力提升:K - means 算法对噪声敏感,离群点易使聚类中心偏移。Canopy 算法在预处理阶段,通过设定距离阈值,可将包含少量样本点(NumPoint 较小)的 Cluster 直接去除。这些小 Cluster 很可能是由噪声或离群点形成的,去掉它们能减少噪声对后续聚类的干扰,提升聚类结果的稳定性 。
  • 聚类中心初始化优化:Canopy 算法在聚类过程中,会确定每个 Canopy 的中心点。将这些中心点作为 K - means 算法的初始聚类中心(K ),相较于 K - means 随机选取初始中心,Canopy 算法得到的中心更具代表性,能使 K - means 更快收敛到更优解,提高聚类精度 。
  • 计算量降低:Canopy 算法先将数据集划分成若干个相互重叠的子集(Canopy) 。后续对每个 Canopy 内部进行 K - means 聚类,无需在整个数据集上进行相似性计算,极大减少了计算量,尤其适用于大规模数据集,能有效提高聚类效率 。

缺点解读

  • 阈值确定难题:Canopy 算法依赖两个距离阈值 T1 和 T2 ,合适的阈值能使算法有效划分数据集。但实际应用中,很难事先确定最优的 T1 和 T2 值。若阈值设置不当,可能导致划分的 Canopy 过于稀疏或过于密集,影响聚类效果。同时,即使使用 Canopy 算法进行预处理,后续基于 Canopy 的 K - means 聚类依旧可能陷入局部最优解,因为 K - means 本身的迭代优化特性容易受初始条件和数据分布影响 。

7.k-means++算法

K - means++ 是 K - means 算法的改进版本,主要改进在于初始聚类中心的选择,目的是让选择的质心尽可能分散,以提升聚类效果,减少陷入局部最优的可能性

初始聚类中心选择概率公式

  • 公式原理其中D(x)表示数据点x到最近已选聚类中心的距离 。该公式计算每个数据点被选为下一个聚类中心的概率,分子是单个数据点到最近已选中心距离的平方,分母是所有数据点到最近已选中心距离平方的总和。通过这种方式,距离已选中心远的点有更大概率被选为新的聚类中心 。

8.二分k-means算法

 

9.K-中心聚类算法

k - medoids 算法抗噪性优势

  • 原理:k - medoids 算法选择实际数据点作为簇中心(medoids ,即中心点),通过最小化绝对误差(如曼哈顿距离等)来确定簇中心。与 k - means 计算均值作为质心不同,它更关注数据点本身的代表性。
  • 示例:样本点(1,1)、(1,2)、(2,1)相对接近,属于正常数据,而(1000,1000)是明显噪声点。k - means 会受噪声影响,使质心偏向噪声点方向;k - medoids 则在所有样本点中选择使簇绝对误差最小的点作为中心,由于噪声点会增大误差,所以更可能在前三个正常样本点中选中心,避免噪声干扰,体现出对噪声的鲁棒性。

k - medoids 算法局限性

  • 计算效率问题:k - medoids 算法计算量较大,随着样本数量增加,计算每个数据点作为中心点时的绝对误差并进行比较的操作会耗费大量时间和资源,导致算法运行速度变慢。
  • 与 k - means 对比:在大规模样本情况下,k - means 虽然对噪声敏感,但少量噪声对其质心计算影响有限,且 k - means 计算简单、效率高。所以综合来看,k - means 在实际应用中更为广泛,而 k - medoids 更适用于对噪声敏感且样本规模较小的场景。

数据降维

1.定义和主要方式

 方式主要是特征选择和主成分分析(因子分析等)

2.特征选择

2.1特征选择定义

旨在从数据中包含的众多特征(属性、指标等)里,找出主要特征,剔除冗余或无关变量。例如分析鸟类相关数据时,羽毛颜色、眼睛宽度等都是可能的特征,需筛选出对研究目的(如区分鸟类种类等)有重要作用的特征 。

2.2特征选择方法

  • Filter(过滤式)也就是直接进行选择
    • 方差选择法:依据特征方差大小筛选。方差小意味着多数样本在该特征上取值相近,对区分样本作用小,可删除。如sklearn.feature_selection.VarianceThreshold(threshold = 0.0) ,默认删除所有样本取值相同(方差为 0 )的特征,也可指定阈值,删除方差低于该值的特征 。
    • 相关系数
      • 皮尔逊相关系数:衡量两变量线性相关程度,取值 [-1, 1] 。r > 0 为正相关,r < 0 为负相关;|r| = 1 完全相关,r = 0 无相关;0 < |r| < 1 存在一定程度相关,|r| 越接近 1 线性关系越密切。可通过from scipy.stats import pearsonr 计算,返回相关系数和 p 值 。
      • 斯皮尔曼相关系数:也是反映变量相关程度的统计指标,能表明变量相关方向,取值 [-1, 1] ,应用比皮尔逊相关系数更广泛 ,计算使用from scipy.stats import spearmanr 。
  • Embedded(嵌入式)也就是在某些算法中嵌入的
    • 决策树:利用信息熵、信息增益等指标,在构建决策树过程中自动选择与目标值关联紧密的特征 。
    • 正则化:如 L1、L2 正则化,在模型训练时通过约束参数,使部分特征系数趋近于 0 ,从而实现特征选择 。
    • 深度学习:如卷积神经网络等,在训练过程中自动学习数据特征,隐式进行特征选择 。

2.3低方差特征过滤

  • 原理:方差用于衡量数据的离散程度。在特征选择中,若某个特征的方差很小,说明该特征在不同样本间取值差异不大,对样本区分能力弱,可视为冗余特征进行删除。例如,在一个关于学生成绩的数据集里,如果 “学生姓名笔画数” 这个特征方差极小,说明该特征对区分学生成绩好坏没什么作用,就可考虑删除。
  • API 使用示例
import pandas as pd
from sklearn.feature_selection import VarianceThreshold

def variance_demo():
    """
    删除低方差特征——特征选择
    :return: None
    """
    data = pd.read_csv("factor_returns.csv")
    print(data)
    # 1、实例化一个转换器类,指定阈值方差为1
    transfer = VarianceThreshold(threshold=1)
    # 2、调用fit_transform进行转换,这里选取data.iloc[:, 1:10]部分数据
    data = transfer.fit_transform(data.iloc[:, 1:10])
    print("删除低方差特征的结果: \n", data)
    print("形状: \n", data.shape)
    return None

2.4相关系数 - 皮尔逊相关系数

  • 原理:皮尔逊相关系数衡量两个变量之间的线性相关程度(皮尔逊低说明的是线性关系弱,并不代表相关性弱,可能还有非线性关系)。它基于变量的均值、标准差等统计量计算。当两个变量的变化趋势呈现同向线性关系时,相关系数为正;反向线性关系时,相关系数为负;若不存在线性关系,相关系数接近 0 。比如研究身高和体重的关系,若身高增加时体重也倾向于增加,皮尔逊相关系数为正。
  • API 及案例
from scipy.stats import pearsonr

x1 = [12.5, 15.3, 23.2, 26.4, 33.5, 34.4, 39.4, 45.2, 55.4, 60.9]
x2 = [21.2, 23.9, 32.9, 34.1, 42.5, 43.2, 49.0, 52.8, 59.4, 63.5]
result = pearsonr(x1, x2)
print(result)

代码中,从scipy.stats导入pearsonr函数,定义两个数据列表x1x2 ,调用pearsonr计算二者的皮尔逊相关系数和 p 值,打印结果。这里得到的相关系数接近 0.994 ,说明x1x2之间存在高度线性正相关关系,p 值极小表明这种相关性在统计上非常显著。

2.5相关系数 - 斯皮尔曼相关系数

  • 原理:斯皮尔曼相关系数是一种非参数统计量,它基于变量的秩次(排序位置)计算,反映变量之间的单调相关关系,不局限于线性关系。例如,研究学生考试成绩排名和平时作业完成质量排名之间的关系,斯皮尔曼相关系数能有效衡量二者关联程度。
  • API 及案例
from scipy.stats import spearmanr

x1 = [12.5, 15.3, 23.2, 26.4, 33.5, 34.4, 39.4, 45.2, 55.4, 60.9]
x2 = [21.2, 23.9, 32.9, 34.1, 42.5, 43.2, 49.0, 52.8, 59.4, 63.5]
result = spearmanr(x1, x2)
print(result)

3.主成分分析(这里只将实现,具体原理参考李航机器学习)

PCA(主成分分析)API 

  • 类定义sklearn.decomposition.PCA(n_components=None) 是用于主成分分析的类,主成分分析是一种常用的数据降维技术,目的是将高维数据转换到较低维数空间,同时尽可能保留数据的关键信息。
  • 参数n_components :
    • 小数形式:表示要保留数据信息的比例。例如n_components = 0.9 ,意味着 PCA 会自动确定一个合适的低维空间维度,使得转换后的数据能够保留原始数据 90% 的信息 。
    • 整数形式:直接指定降维后数据的特征维度。如n_components = 3 ,就是将数据降到 3 维 。
  • 方法fit_transform(X) :X需是numpy array格式,形状为[n_samples, n_features] (n_samples是样本数量,n_features是特征数量) 。该方法先对数据进行拟合(学习数据的分布特征等),再进行转换(降维操作),返回降维后指定维度的数组 。

PCA 代码示例

from sklearn.decomposition import PCA

def pca_demo():
    """
    对数据进行PCA降维
    :return: None
    """
    data = [[2,8,4,5], [6,3,0,8], [5,4,9,1]]
    # 1、实例化PCA,小数——保留多少信息
    transfer = PCA(n_components=0.9)
    # 2、调用fit_transform
    data1 = transfer.fit_transform(data)
    print("保留90%的信息,降维结果为: \n", data1)
    # 1、实例化PCA,整数——指定降维到的维数
    transfer2 = PCA(n_components=3)
    # 2、调用fit_transform
    data2 = transfer2.fit_transform(data)
    print("降维到3维的结果: \n", data2)
    return None


网站公告

今日签到

点亮在社区的每一天
去签到