GitHub_Trending/ml/ml-course无监督学习:聚类与降维算法解析

GitHub_Trending/ml/ml-course无监督学习:聚类与降维算法解析

【免费下载链接】ml-course Open Machine Learning course 【免费下载链接】ml-course 项目地址: https://gitcode.com/GitHub_Trending/ml/ml-course

引言:无监督学习的核心价值

在机器学习领域,无监督学习(Unsupervised Learning)扮演着至关重要的角色。与有监督学习不同,无监督学习不需要预先标注的训练数据,而是从数据本身发现隐藏的模式和结构。这种学习方式更接近人类认知的本质——通过观察和归纳来理解世界。

本文将深入解析GitHub_Trending/ml/ml-course项目中无监督学习的核心算法,重点聚焦于聚类(Clustering)和降维(Dimensionality Reduction)两大技术方向。通过理论解析、代码示例和实际应用场景,帮助读者全面掌握这些强大的数据分析工具。

聚类算法:发现数据的内在分组

K-Means聚类算法

K-Means是最经典且广泛使用的聚类算法,其核心思想是通过迭代优化将数据点分配到K个簇中。

import numpy as np
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt

# 生成示例数据
np.random.seed(42)
X = np.random.randn(300, 2)
X[:100] += 5
X[100:200] += 10

# K-Means聚类
kmeans = KMeans(n_clusters=3, random_state=42)
clusters = kmeans.fit_predict(X)
centers = kmeans.cluster_centers_

# 可视化结果
plt.figure(figsize=(10, 6))
plt.scatter(X[:, 0], X[:, 1], c=clusters, cmap='viridis', alpha=0.7)
plt.scatter(centers[:, 0], centers[:, 1], c='red', s=200, marker='X')
plt.title('K-Means Clustering Results')
plt.xlabel('Feature 1')
plt.ylabel('Feature 2')
plt.show()

层次聚类算法

层次聚类(Hierarchical Clustering)通过构建树状结构来展示数据的层次关系,分为凝聚式和分裂式两种方法。

from scipy.cluster.hierarchy import dendrogram, linkage
from sklearn.datasets import make_blobs

# 生成数据
X, y = make_blobs(n_samples=50, centers=3, random_state=42)

# 层次聚类
linked = linkage(X, 'ward')

# 绘制树状图
plt.figure(figsize=(12, 8))
dendrogram(linked, orientation='top', distance_sort='descending', show_leaf_counts=True)
plt.title('Hierarchical Clustering Dendrogram')
plt.xlabel('Sample Index')
plt.ylabel('Distance')
plt.show()

DBSCAN密度聚类

DBSCAN(Density-Based Spatial Clustering of Applications with Noise)基于数据点密度进行聚类,能够发现任意形状的簇并识别噪声点。

from sklearn.cluster import DBSCAN
from sklearn.datasets import make_moons

# 生成半月形数据
X, y = make_moons(n_samples=200, noise=0.05, random_state=42)

# DBSCAN聚类
dbscan = DBSCAN(eps=0.3, min_samples=5)
clusters = dbscan.fit_predict(X)

# 可视化
plt.figure(figsize=(10, 6))
plt.scatter(X[:, 0], X[:, 1], c=clusters, cmap='viridis')
plt.title('DBSCAN Clustering on Moon-shaped Data')
plt.xlabel('Feature 1')
plt.ylabel('Feature 2')
plt.show()

降维技术:简化复杂数据

主成分分析(PCA)

PCA是最常用的线性降维方法,通过找到数据方差最大的方向来实现降维。

from sklearn.decomposition import PCA
from sklearn.datasets import load_iris
import pandas as pd

# 加载鸢尾花数据集
iris = load_iris()
X = iris.data
y = iris.target

# PCA降维
pca = PCA(n_components=2)
X_pca = pca.fit_transform(X)

# 可视化降维结果
plt.figure(figsize=(10, 6))
scatter = plt.scatter(X_pca[:, 0], X_pca[:, 1], c=y, cmap='viridis')
plt.colorbar(scatter)
plt.title('PCA: Iris Dataset (2D Projection)')
plt.xlabel('First Principal Component')
plt.ylabel('Second Principal Component')
plt.show()

# 解释方差比
print(f"Explained variance ratio: {pca.explained_variance_ratio_}")
print(f"Total explained variance: {sum(pca.explained_variance_ratio_):.3f}")

奇异值分解(SVD)在图像压缩中的应用

SVD是矩阵分解的重要技术,在图像处理、推荐系统等领域有广泛应用。

import numpy as np
from PIL import Image
import matplotlib.pyplot as plt

def compress_image_svd(image_path, k_values):
    """
    使用SVD进行图像压缩
    """
    # 读取图像
    img = Image.open(image_path)
    img_array = np.array(img)
    
    # 分离RGB通道
    R = img_array[:, :, 0].astype(float)
    G = img_array[:, :, 1].astype(float)
    B = img_array[:, :, 2].astype(float)
    
    compressed_images = []
    
    for k in k_values:
        # 对每个通道进行SVD
        U_r, S_r, Vt_r = np.linalg.svd(R, full_matrices=False)
        U_g, S_g, Vt_g = np.linalg.svd(G, full_matrices=False)
        U_b, S_b, Vt_b = np.linalg.svd(B, full_matrices=False)
        
        # 截断SVD
        R_compressed = U_r[:, :k] @ np.diag(S_r[:k]) @ Vt_r[:k, :]
        G_compressed = U_g[:, :k] @ np.diag(S_g[:k]) @ Vt_g[:k, :]
        B_compressed = U_b[:, :k] @ np.diag(S_b[:k]) @ Vt_b[:k, :]
        
        # 合并通道
        compressed = np.stack([R_compressed, G_compressed, B_compressed], axis=2)
        compressed = np.clip(compressed, 0, 255).astype(np.uint8)
        compressed_images.append(compressed)
    
    return compressed_images

# 示例:使用不同数量的奇异值进行压缩
k_values = [5, 20, 50, 100]
compressed_images = compress_image_svd('sample_image.jpg', k_values)

# 显示压缩结果
fig, axes = plt.subplots(2, 3, figsize=(15, 10))
for i, (k, img) in enumerate(zip(k_values, compressed_images)):
    row, col = i // 3, i % 3
    axes[row, col].imshow(img)
    axes[row, col].set_title(f'k = {k}')
    axes[row, col].axis('off')
plt.tight_layout()
plt.show()

t-SNE非线性降维

t-SNE(t-Distributed Stochastic Neighbor Embedding)是一种优秀的非线性降维方法,特别适合高维数据的可视化。

from sklearn.manifold import TSNE
from sklearn.datasets import load_digits

# 加载手写数字数据集
digits = load_digits()
X = digits.data
y = digits.target

# t-SNE降维
tsne = TSNE(n_components=2, random_state=42, perplexity=30)
X_tsne = tsne.fit_transform(X)

# 可视化
plt.figure(figsize=(12, 8))
scatter = plt.scatter(X_tsne[:, 0], X_tsne[:, 1], c=y, cmap='tab10', alpha=0.7)
plt.colorbar(scatter, label='Digit')
plt.title('t-SNE Visualization of Handwritten Digits')
plt.xlabel('t-SNE Component 1')
plt.ylabel('t-SNE Component 2')
plt.show()

聚类算法对比分析

下表总结了主要聚类算法的特点和适用场景:

算法优点缺点适用场景
K-Means简单高效,可扩展性好需要指定K值,对异常值敏感球形簇,大规模数据
层次聚类不需要指定簇数,可视化友好计算复杂度高,内存消耗大小规模数据,层次结构分析
DBSCAN能发现任意形状簇,抗噪声对参数敏感,高维数据效果差密度不均匀数据,异常检测
高斯混合模型概率模型,软聚类计算复杂,可能收敛到局部最优概率建模,重叠簇

降维技术性能对比

方法类型保持特性计算复杂度适用场景
PCA线性全局方差O(n³)线性数据,特征提取
LDA线性类别可分性O(n³)有监督降维,分类任务
t-SNE非线性局部结构O(n²)高维数据可视化
UMAP非线性全局和局部结构O(n¹.¹⁴)大规模数据降维

实际应用案例

客户细分分析

import pandas as pd
from sklearn.preprocessing import StandardScaler
from sklearn.cluster import KMeans
import seaborn as sns

# 加载客户数据
customer_data = pd.read_csv('customer_data.csv')

# 数据预处理
scaler = StandardScaler()
scaled_data = scaler.fit_transform(customer_data[['age', 'income', 'spending_score']])

# 确定最佳K值(肘部法则)
inertia = []
k_range = range(1, 11)

for k in k_range:
    kmeans = KMeans(n_clusters=k, random_state=42)
    kmeans.fit(scaled_data)
    inertia.append(kmeans.inertia_)

plt.figure(figsize=(10, 6))
plt.plot(k_range, inertia, 'bo-')
plt.xlabel('Number of clusters (K)')
plt.ylabel('Inertia')
plt.title('Elbow Method for Optimal K')
plt.show()

# 应用K-Means聚类
optimal_k = 5  # 根据肘部法则确定
kmeans = KMeans(n_clusters=optimal_k, random_state=42)
customer_data['cluster'] = kmeans.fit_predict(scaled_data)

# 聚类分析
cluster_summary = customer_data.groupby('cluster').agg({
    'age': 'mean',
    'income': 'mean', 
    'spending_score': 'mean',
    'customer_id': 'count'
}).rename(columns={'customer_id': 'count'})

print("Cluster Summary:")
print(cluster_summary)

文本数据降维与聚类

from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.decomposition import TruncatedSVD
from sklearn.cluster import KMeans
import numpy as np

# 示例文本数据
documents = [
    "machine learning algorithms deep learning",
    "natural language processing text mining",
    "computer vision image recognition",
    "data science big data analytics",
    "neural networks deep learning",
    "text classification sentiment analysis",
    "image processing computer vision",
    "predictive modeling machine learning"
]

# TF-IDF向量化
vectorizer = TfidfVectorizer(max_features=1000)
X_tfidf = vectorizer.fit_transform(documents)

# SVD降维
svd = TruncatedSVD(n_components=2, random_state=42)
X_svd = svd.fit_transform(X_tfidf)

# K-Means聚类
kmeans = KMeans(n_clusters=3, random_state=42)
clusters = kmeans.fit_predict(X_svd)

# 可视化
plt.figure(figsize=(10, 6))
scatter = plt.scatter(X_svd[:, 0], X_svd[:, 1], c=clusters, cmap='viridis')
for i, txt in enumerate(range(len(documents))):
    plt.annotate(f'Doc{i+1}', (X_svd[i, 0], X_svd[i, 1]))
plt.title('Text Document Clustering after SVD')
plt.xlabel('SVD Component 1')
plt.ylabel('SVD Component 2')
plt.show()

最佳实践与注意事项

数据预处理的重要性

# 正确的数据预处理流程
from sklearn.preprocessing import StandardScaler, Normalizer
from sklearn.pipeline import Pipeline

# 创建预处理和聚类的管道
pipeline = Pipeline([
    ('scaler', StandardScaler()),      # 标准化
    ('normalizer', Normalizer()),      # 归一化(可选)
    ('pca', PCA(n_components=0.95)),   # 保留95%方差的PCA
    ('cluster', KMeans(n_clusters=5))  # 聚类
])

# 训练和预测
clusters = pipeline.fit_predict(data)

聚类质量评估

from sklearn.metrics import silhouette_score, calinski_harabasz_score

# 轮廓系数(-1到1,越大越好)
silhouette_avg = silhouette_score(X, clusters)
print(f"Silhouette Score: {silhouette_avg:.3f}")

# Calinski-Harabasz指数(越大越好)
ch_score = calinski_harabasz_score(X, clusters)
print(f"Calinski-Harabasz Score: {ch_score:.3f}")

# 肘部法则可视化
def plot_elbow_method(X, max_k=10):
    inertia = []
    k_range = range(1, max_k + 1)
    
    for k in k_range:
        kmeans = KMeans(n_clusters=k, random_state=42)
        kmeans.fit(X)
        inertia.append(kmeans.inertia_)
    
    plt.figure(figsize=(10, 6))
    plt.plot(k_range, inertia, 'bo-')
    plt.xlabel('Number of clusters')
    plt.ylabel('Inertia')
    plt.title('Elbow Method for Optimal K')
    plt.show()

总结与展望

无监督学习中的聚类和降维算法为数据分析提供了强大的工具。通过本文的详细解析,我们了解到:

  1. 聚类算法帮助我们发现数据中的自然分组,适用于客户细分、异常检测、模式识别等场景
  2. 降维技术不仅减少计算复杂度,还能帮助可视化高维数据,发现数据的内在结构
  3. 算法选择需要根据数据特性和任务需求综合考虑,没有一种算法适用于所有场景

在实际应用中,建议:

  • 始终进行数据预处理和标准化
  • 使用多种评估指标验证聚类质量
  • 结合业务知识解释聚类结果
  • 尝试多种算法并比较结果

随着深度学习和大数据技术的发展,无监督学习将继续在自动化特征工程、异常检测、推荐系统等领域发挥重要作用。掌握这些基础算法将为应对复杂的数据分析挑战奠定坚实基础。

【免费下载链接】ml-course Open Machine Learning course 【免费下载链接】ml-course 项目地址: https://gitcode.com/GitHub_Trending/ml/ml-course

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值