Python实现聚类分析和数据降维

简介: Python实现聚类分析和数据降维

KMeans聚类算法


KMeans算法介绍


       K-Means是聚类算法中最常用的一种,是一种迭代求解的聚类分析算法; 聚类是一种 无监督学习,事先并不知道分类标签是什么,它能够将具有相似特征的对象划分 到同一个集 合(簇)中。簇内的对象越相似,聚类算法的效果越好。


KMeans算法原理


1 从样本中随机选择K个点——聚类中心(也可以随机生成K个并不存在于原始 数据中的样 本点作为初始聚类中心)

2 簇分配:遍历每个样本,然后根据每一个点是与红色聚类中心更近,还是与 蓝色聚类中心更近,来将每个数据点分配给K个聚类中心之一

3 根据聚类结果,重新计算k个簇各自的平均值(Means)位置,将该平均值位 置作为该簇新的聚类中心

4 不断重复迭代上述的(2)与(3)两个步骤,直到聚类中心点的变化很小, 或者达到指定的迭代次数

KMeans损失函数



KMeans损失函数是每个数据点与其所关联的聚类中心点之间的平均距离

最小化损失函数可以帮助k-means找到更好的簇

注意 : 对于聚类数量的选择(参数K的选择),没有一个统一的选择方法,可以根 据业务需要选择


KMeans的衡量指标


CH指标:同时考虑了各个簇之间的分离程度与簇内部的分离程度,来衡量聚类 效果。CH分数越高,说明聚类效果越好


实战——KMeans聚类分析

sklearn中使用sklearn.cluster.KMeans实现KMeans算法


KMeans聚类效果衡量指标使用sklearn.metrics.calinski_harabasz_score


import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_blobs
# 生成数据样本
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=666)
plt.scatter(X[:,0],X[:,1])
plt.show()



先用KMeans聚成两类观察


from sklearn.cluster import KMeans
# 创建KMeans算法对象,设置聚成两类
km = KMeans(n_clusters=2,random_state=666) 
km.fit(X) # 无监督学习,拟合的时候不需要样本标签
y_predict = km.predict(X)  # 预测
plt.scatter(X[:,0],X[:,1],c=y_predict)  # 预测为同一簇的样本同颜色
plt.show()


# 使用CH指标评价聚类效果(本题是在训练样本集上评价)
from sklearn.metrics import calinski_harabasz_score
calinski_harabasz_score(X,y_predict)

KMeans聚成四类观察


from sklearn.cluster import KMeans
# 创建KMeans算法对象,设置聚成四类
km2 = KMeans(n_clusters=4,random_state=666) 
km2.fit(X) # 无监督学习,拟合的时候不需要样本标签
y_predict2 = km2.predict(X)  # 预测
plt.scatter(X[:,0],X[:,1],c=y_predict2)  # 预测为同一簇的样本同颜色
plt.show()


# 使用CH指标评价聚类效果(本题是在训练样本集上评价)
from sklearn.metrics import calinski_harabasz_score
calinski_harabasz_score(X,y_predict2)


显然聚成四类要比聚成两类效果好


PCA降维原理

PCA(Principal Component Analysis),主成分分析是线性 的数据降维技术,采用一 种数学降维的方法,在损失很少信息的前提下,找出几个综合变量 作为主成分,来代替原来 众多的变量,使这些主成分能够尽可能地代表原始数据的信息,其 中每个主成分都是原始变 量的线性组合,而且各个主成分之间不相关(即线性无关)。


sklearn中使用PCA


在sklearn中使用PCA降维要使用sklearn.decomposition.PCA

PCA对象的explained_variance_表示PCA的解释方差得分

拟合使用fit方法,降维使用transform方法

实战_PCA对红酒数据降维并可视化

from sklearn.decomposition import PCA
from sklearn.preprocessing import StandardScaler
from sklearn import datasets
wine_x,wine_y = datasets.load_wine(return_X_y=True)   # 加载红酒数据
wine_x = StandardScaler().fit_transform(wine_x)  # 对酒的特征进行标准化
import matplotlib.pyplot as plt
# 使用PCA对酒数据集进行降维
pca = PCA(n_components=13,random_state=123)
pca.fit(wine_x)
# 可视化PCA的解释方差得分
exvar = pca.explained_variance_  # 获取PCA的解释方差得分
plt.figure(figsize=(10,6))
plt.plot(exvar,"r-o")
plt.hlines(y=1,xmin=0,xmax=12)   # 横线绘制
plt.xlabel("the number of attribute")
plt.ylabel("explained variance")
plt.title("PCA")
plt.show()




可以发现,使用数据的前三个主成分较合适



pca_wine_x = pca.transform(wine_x)[:,:3]   # 降维操作
pca_wine_x.shape
colors = ["red","blue","green"]
shapes = ["o","s","*"]
fig = plt.figure(figsize=(10,6))
# 将坐标系设置为3D坐标系
ax1 = fig.add_subplot(111,projection="3d")
for ii,y in enumerate(wine_y):
    ax1.scatter(pca_wine_x[ii,0],pca_wine_x[ii,1],pca_wine_x[ii,2],
                s=40,c=colors[y],marker=shapes[y])
ax1.set_xlabel("Principal Component 1",rotation=20)
ax1.set_ylabel("Principal Component 2",rotation=-20)
ax1.set_zlabel("Principal Component 3",rotation=90)
ax1.azim = 225
ax1.set_title("PCA ")
plt.show()



实战_KPCA核主成分分析


KPCA降维原理


       核主成分分析(Kernel Principal Component Analysis)对于 输入空间中的矩阵X,先 用一个非线性映射把X中的所有样本映射到一个高维甚至是无穷维的 空间(特征空间),使 其线性可分,然后在这个高维空间进行PCA降维。


sklearn中使用KPCA


在sklearn中使用PCA降维要使用 sklearn.decomposition.KernelPCA

KernelPCA对象的lambdas_表示KPCA的中心核矩阵特征值

拟合使用fit方法,降维使用transform方法

from sklearn.decomposition import KernelPCA
from sklearn.preprocessing import StandardScaler
from sklearn import datasets
# 解决中文乱码和负号显示的设置
import matplotlib as mpl
mpl.rcParams['font.sans-serif'] = ['SimHei']  
mpl.rcParams['font.serif'] = ['SimHei']
mpl.rcParams['axes.unicode_minus'] = False # 解决保存图像是负号'-'显示为方块的问题,或者转换负号为字符串
wine_x,wine_y = datasets.load_wine(return_X_y=True)   # 加载红酒数据
wine_x = StandardScaler().fit_transform(wine_x)  # 对酒的特征进行标准化
import matplotlib.pyplot as plt
# 使用KPCA获取数据的主成分
# 核函数使用rbf核
kpca = KernelPCA(n_components=13,kernel="rbf",gamma=0.2,random_state=123)
kpca.fit(wine_x)
# 可视化KPCA的中心矩阵特征值
lambdas = kpca.lambdas_
plt.figure(figsize=(10,6))
plt.plot(lambdas,"r-o")
plt.hlines(y=4,xmin=0,xmax=12)
plt.xlabel("特征数量")
plt.ylabel("中心核矩阵的特征值大小")
plt.title("核主成分分析")
plt.show()


# 获取前3个核主成分
kpca_wine_x = kpca.transform(wine_x)[:,:3]  # 降维操作
kpca_wine_x.shape
# 在3D空间中可视化KPCA分析后的数据空间分布
colors = ["red","blue","green"]
shapes = ["o","s","*"]
fig = plt.figure(figsize=(10,6))
# 将坐标系设置为3D坐标系
ax1 = fig.add_subplot(111,projection="3d")
for ii,y in enumerate(wine_y):
    ax1.scatter(kpca_wine_x[ii,0],kpca_wine_x[ii,1],kpca_wine_x[ii,2],
                s=40,c=colors[y],marker=shapes[y])
ax1.set_xlabel("核主成分1",rotation=20)
ax1.set_ylabel("核主成分2",rotation=-20)
ax1.set_zlabel("核主成分3",rotation=90)
ax1.azim = 225
ax1.set_title("KPCA特征空间可视化")
plt.show()


实战_t-SNE数据降维

t-SNE降维原理


       TSNE是另一种常用的数据降维方法。由T和SNE组成,也就是T 分布和随机近邻嵌入 (Stochastic neighbour Embedding)。其主要优势在于高维数据 空间中距离相近的点投 影到低维空间中仍然相近。 t-SNE(TSNE)将数据点之间的相似度转换为概率。原始空间中的 相似度由高斯联合概率 表示,嵌入空间的相似度由“学生t分布”表示。


       简单解释t-SNE的降维原理:想要将二维数据点映射到一维,并 且还要保存原来二维空间 中的聚类情况。




sklearn中使用t-SNE

from sklearn.decomposition import PCA
from sklearn.manifold import TSNE
from sklearn.preprocessing import StandardScaler
from sklearn import datasets
# 解决中文乱码和负号显示的设置
import matplotlib as mpl
mpl.rcParams['font.sans-serif'] = ['SimHei']  
mpl.rcParams['font.serif'] = ['SimHei']
mpl.rcParams['axes.unicode_minus'] = False # 解决保存图像是负号'-'显示为方块的问题,或者转换负号为字符串
wine_x,wine_y = datasets.load_wine(return_X_y=True)   # 加载红酒数据
wine_x = StandardScaler().fit_transform(wine_x)  # 对酒的特征进行标准化
# 创建TSNE对象,设置低维空间的维度(保留的特征数)
tsne = TSNE(n_components=3,perplexity=25,early_exaggeration=3,
            random_state=123)
tsne_wine_x = tsne.fit_transform(wine_x)   #  拟合并转换(降维)
import matplotlib.pyplot as plt
colors = ["red","blue","green"]
shapes = ["o","s","*"]
fig = plt.figure(figsize=(10,6))
# 将坐标系设置为3D坐标系
ax1 = fig.add_subplot(111,projection="3d")
for ii,y in enumerate(wine_y):
    ax1.scatter(tsne_wine_x[ii,0],tsne_wine_x[ii,1],tsne_wine_x[ii,2],
                s=40,c=colors[y],marker=shapes[y])
ax1.set_xlabel("特征1",rotation=20)
ax1.set_ylabel("特征2",rotation=-20)
ax1.set_zlabel("特征3",rotation=90)
ax1.azim = 225
ax1.set_title("TSNE降维并可视化")
plt.show()
目录
相关文章
|
28天前
|
数据采集 JSON 数据处理
抓取和分析JSON数据:使用Python构建数据处理管道
在大数据时代,电商网站如亚马逊、京东等成为数据采集的重要来源。本文介绍如何使用Python结合代理IP、多线程等技术,高效、隐秘地抓取并处理电商网站的JSON数据。通过爬虫代理服务,模拟真实用户行为,提升抓取效率和稳定性。示例代码展示了如何抓取亚马逊商品信息并进行解析。
抓取和分析JSON数据:使用Python构建数据处理管道
|
12天前
|
图形学 Python
SciPy 空间数据2
凸包(Convex Hull)是计算几何中的概念,指包含给定点集的所有凸集的交集。可以通过 `ConvexHull()` 方法创建凸包。示例代码展示了如何使用 `scipy` 库和 `matplotlib` 绘制给定点集的凸包。
22 1
|
13天前
|
JSON 数据格式 索引
Python中序列化/反序列化JSON格式的数据
【11月更文挑战第4天】本文介绍了 Python 中使用 `json` 模块进行序列化和反序列化的操作。序列化是指将 Python 对象(如字典、列表)转换为 JSON 字符串,主要使用 `json.dumps` 方法。示例包括基本的字典和列表序列化,以及自定义类的序列化。反序列化则是将 JSON 字符串转换回 Python 对象,使用 `json.loads` 方法。文中还提供了具体的代码示例,展示了如何处理不同类型的 Python 对象。
|
14天前
|
数据采集 Web App开发 iOS开发
如何使用 Python 语言的正则表达式进行网页数据的爬取?
使用 Python 进行网页数据爬取的步骤包括:1. 安装必要库(requests、re、bs4);2. 发送 HTTP 请求获取网页内容;3. 使用正则表达式提取数据;4. 数据清洗和处理;5. 循环遍历多个页面。通过这些步骤,可以高效地从网页中提取所需信息。
|
1月前
|
数据处理 Python
Python实用记录(十):获取excel数据并通过列表的形式保存为txt文档、xlsx文档、csv文档
这篇文章介绍了如何使用Python读取Excel文件中的数据,处理后将其保存为txt、xlsx和csv格式的文件。
49 3
Python实用记录(十):获取excel数据并通过列表的形式保存为txt文档、xlsx文档、csv文档
|
1月前
|
计算机视觉 Python
Python实用记录(九):将不同的图绘制在一起、将不同txt文档中的数据绘制多条折线图
这篇文章介绍了如何使用Python的OpenCV库将多张图片合并为一张图片显示,以及如何使用matplotlib库从不同txt文档中读取数据并绘制多条折线图。
42 3
Python实用记录(九):将不同的图绘制在一起、将不同txt文档中的数据绘制多条折线图
|
26天前
|
数据可视化 算法 JavaScript
基于图论的时间序列数据平稳性与连通性分析:利用图形、数学和 Python 揭示时间序列数据中的隐藏模式
本文探讨了如何利用图论分析时间序列数据的平稳性和连通性。通过将时间序列数据转换为图结构,计算片段间的相似性,并构建连通图,可以揭示数据中的隐藏模式。文章介绍了平稳性的概念,提出了基于图的平稳性度量,并展示了图分区在可视化平稳性中的应用。此外,还模拟了不同平稳性和非平稳性程度的信号,分析了图度量的变化,为时间序列数据分析提供了新视角。
53 0
基于图论的时间序列数据平稳性与连通性分析:利用图形、数学和 Python 揭示时间序列数据中的隐藏模式
|
1月前
|
自然语言处理 算法 数据挖掘
探讨如何利用Python中的NLP工具,从被动收集到主动分析文本数据的过程
【10月更文挑战第11天】本文介绍了自然语言处理(NLP)在文本分析中的应用,从被动收集到主动分析的过程。通过Python代码示例,详细展示了文本预处理、特征提取、情感分析和主题建模等关键技术,帮助读者理解如何有效利用NLP工具进行文本数据分析。
47 2
|
12天前
|
索引 Python
SciPy 空间数据1
SciPy 通过 `scipy.spatial` 模块处理空间数据,如判断点是否在边界内、计算最近点等。三角测量是通过测量角度来确定目标距离的方法。多边形的三角测量可将其分解为多个三角形,用于计算面积。Delaunay 三角剖分是一种常用方法,可以对一系列点进行三角剖分。示例代码展示了如何使用 `Delaunay()` 函数创建三角形并绘制。
22 0
|
1月前
|
JSON 安全 数据安全/隐私保护
深度剖析:Python如何运用OAuth与JWT,为数据加上双保险🔐
【10月更文挑战第10天】本文介绍了OAuth 2.0和JSON Web Tokens (JWT) 两种现代Web应用中最流行的认证机制。通过使用Flask-OAuthlib和PyJWT库,详细展示了如何在Python环境中实现这两种认证方式,从而提升系统的安全性和开发效率。OAuth 2.0适用于授权过程,JWT则简化了认证流程,确保每次请求的安全性。结合两者,可以构建出既安全又高效的认证体系。
44 1