在做机器学习的时候,经常会遇到三个特征以上的数据,这类数据通常被称为高维数据。数据做好类别分类后,通过二维图或者三维图进行可视化,对于高维数据可以通过PCA(Principal Component Analysis),即主成分分析方法,是一种使用最广泛的数据降维算法。

PCA的主要思想是将n维特征映射到k维上,这k维是全新的正交特征也被称为主成分,是在原有n维特征的基础上重新构造出来的k维特征。详情可参考降维——PCA

代码实现

这里以KNN为例,可视化KNN分类高维数据的结果,代码如下:

import pandas as pd
import matplotlib.pyplot as plt
from sklearn.neighbors import KNeighborsClassifier
from sklearn.decomposition import KernelPCA# 原始数据
path = 'data.csv'
raw_data = pd.read_csv(path, header=0).to_numpy().tolist()
print('原始数据维度:', len(raw_data[0][1:]))# 坐标归一化,统一尺度
tmp_data = []
for points in raw_data:points_x, points_y = points[1::2], points[2::2]max_x, min_x, max_y, min_y = max(points_x), min(points_x), max(points_y), min(points_y)tmp_data.append(points[:1])  # 存储标签for x, y in zip(points_x, points_y):tmp_data[-1].extend([(x - min_x) / (max_x - min_x), (y - min_y) / (max_y - min_y)])  # 存储坐标
raw_data = tmp_data# PCA降维
pca_data = [i[1:] for i in raw_data]
pca = KernelPCA(n_components=3, kernel='cosine')
pca_data = pca.fit_transform(pca_data).tolist()
print('降维数据维度:', len(pca_data[0]))# knn预测,保留一个数据作为预测数据,剩下的作为训练数据
k = 5
error = 0
color_cate = {1: 'b', 2: 'r', 3: 'g', 4: 'y'}
plt.figure(figsize=(10, 6))
for index1, item1 in enumerate(zip(raw_data, pca_data)):raw_points, pca_points = item1[0], item1[1]x_train, y_train = [], []for index2, item2 in enumerate(raw_data):if index1 != index2:x_train.append(item2[1:])y_train.append(item2[0])knn = KNeighborsClassifier(n_neighbors=k, weights='distance')knn.fit(x_train, y_train)x_test = [raw_points[1:]]predict = knn.predict(x_test)if predict[0] != raw_points[0]:error += 1print('预测:', predict[0], '真实:', raw_points[:1])# 用PCA降维的数据可视化color = color_cate[predict[0]]if len(pca_points) == 3:# 画二维图plt.subplot(121)plt.scatter(pca_points[0], pca_points[1], linewidths=0, color=color)# 画三维图ax = plt.subplot(122, projection='3d')ax.scatter(pca_points[0], pca_points[1], pca_points[2], linewidths=0, color=color)
print('错误:', error)
plt.show()

数据格式

我的数据格式如下,第一列为标签,后面为坐标,一个坐标(x,y)为一个特征

归一化

由于我的数据特征是不同图像的坐标点,尺度不一样,需要对其进行归一化处理。归一化公式:

# 坐标归一化,统一尺度
tmp_data = []
for points in raw_data:points_x, points_y = points[1::2], points[2::2]max_x, min_x, max_y, min_y = max(points_x), min(points_x), max(points_y), min(points_y)tmp_data.append(points[:1])  # 存储标签for x, y in zip(points_x, points_y):tmp_data[-1].extend([(x - min_x) / (max_x - min_x), (y - min_y) / (max_y - min_y)])  # 存储坐标
raw_data = tmp_data

PCA降维

# PCA降维
pca_data = [i[1:] for i in raw_data]
pca = KernelPCA(n_components=3, kernel='cosine')
pca_data = pca.fit_transform(pca_data).tolist()
print('降维数据维度:', len(pca_data[0]))

这里用的是核主成分分析方法,个人觉得KernelPCA的数据分布更容易区分。超参数n_components正整数时,指保留主成分的维数;为 (0,1] 范围的实数时,表示主成分的方差和所占的最小阈值。详情参考:Sklearn主成分分析

KNN预测

# knn预测原始数据,保留一个数据作为预测数据,剩下的作为训练数据
k = 5
error = 0
color_cate = {1: 'b', 2: 'r', 3: 'g', 4: 'y'}
plt.figure(figsize=(10, 6))
for index1, item1 in enumerate(zip(raw_data, pca_data)):raw_points, pca_points = item1[0], item1[1]x_train, y_train = [], []for index2, item2 in enumerate(raw_data):if index1 != index2:x_train.append(item2[1:])y_train.append(item2[0])knn = KNeighborsClassifier(n_neighbors=k, weights='distance')knn.fit(x_train, y_train)x_test = [raw_points[1:]]predict = knn.predict(x_test)if predict[0] != raw_points[0]:error += 1print('预测:', predict[0], '真实:', raw_points[:1])

这里以KNN预测为例,预测原始数据,保留一个数据作为预测数据,剩下的作为训练数据,遍历预测。KNN中的k值指最近邻数据的个数。k个数据中类别数最多的类别即为预测数据的类别,当类别数一致时,可以设置超参数weightsdistance,表示不同距离的点有不同的权重,权重更大的即为预测类别。详情参考:K最近邻算法(KNN)。

可视化

# 用PCA降维的数据可视化
color = color_cate[predict[0]]
if len(pca_points) == 3:# 画二维图plt.subplot(121)plt.scatter(pca_points[0], pca_points[1], linewidths=0, color=color)# 画三维图ax = plt.subplot(122, projection='3d')ax.scatter(pca_points[0], pca_points[1], pca_points[2], linewidths=0, color=color)

当使用PCA降维到3维时,可以同时可视化二维图三维图。注意:用matplotlib画图读取的数据不能为字符串,否则显示出来会有误。效果如下:

参考链接

【机器学习】降维——PCA(非常详细) - 知乎

Python数模笔记-Sklearn(3)主成分分析 - youcans - 博客园

K最近邻算法(KNN)---sklearn+python实现_zcc_TPJH的博客-CSDN博客_knn python sklearn

高维数据PCA降维可视化(KNN分类)相关推荐

  1. 高维数据特征降维技术学习

    原文地址:高维数据特征降维技术学习 作者:新技术笔记 特征降维(feature dimension reduction)是一个从初始高维特征集合中选出低维特征集合,以便根据一定的评估准则最优化缩小特征 ...

  2. python使用TSNE为影像组学(radiomics)数据进行降维可视化分析

    python使用TSNE为影像组学(radiomics)数据进行降维可视化分析 目录 python使用TSNE为影像组学(radiomics)数据进行降维可视化分析

  3. 流形学习-高维数据的降维与可视化

    1.流形学习的概念 流形学习方法(Manifold Learning),简称流形学习,自2000年在著名的科学杂志<Science>被首次提出以来,已成为信息科学领域的研究热点.在理论和应 ...

  4. R语言主成分分析PCA谱分解、奇异值分解预测分析运动员表现数据和降维可视化

    最近我们被客户要求撰写关于主成分分析PCA的研究报告,包括一些图形和统计输出. 本文描述了如何 使用R执行主成分分析 ( PCA ).您将学习如何 使用 PCA预测 新的个体和变量坐标.我们还将提供  ...

  5. 对高维数据进行降维的算法

    解析: 维度灾难:在高维情况下出现的数据样本稀疏,距离计算困难等问题. 缓解维度灾难的一个重要途径就是降维,通过某种数学变换将原始高维属性空间转变成一个低维子空间,在这个子空间中样本密度大幅提高,距离 ...

  6. 脑洞大开!高维数据怎样做出可视化效果的5个思路(多图)

    每个数据对象有两个或两个以上独立或者相关属性的数据. 一维数据 一维数据可以利用饼图.条形图来表示. 二维数据 请点击此处输入图片描述 三维数据 高维数据 高维指数据具有多个独立属性,多元指数据具有多 ...

  7. python高维数据_t-SNE高维数据可视化(python)

    t-SNE实践--sklearn教程 t-SNE是一种集降维与可视化于一体的技术,它是基于SNE可视化的改进,解决了SNE在可视化后样本分布拥挤.边界不明显的特点,是目前最好的降维可视化手段. 关于t ...

  8. 12- 降维算法 (PCA降维/LDA分类/NMF) (数据处理)

    数据降维就是一种对高维度特征数据预处理方法.降维是将高维度的数据保留下最重要的一些特征,去除噪声和不重要的特征,从而实现提升数据处理速度的目的. PCA算法有两种实现方法: 基于特征值分解协方差矩阵实 ...

  9. 10 降维算法(PCA降维/LDA分类/NMF非负矩阵)

    数据降维简介 降维就是一种对高维度特征数据预处理方法.降维是将高维度的数据保留下最重要的一些特征,去除噪声和不重要的特征,从而实现提升数据处理速度的目的. 降维具有如下一些优点: 减少所需的存储空间. ...

最新文章

  1. sae上部署第一个站
  2. printf()详解
  3. wxWidgets:wxFileCtrlEvent类用法
  4. 新疆尉犁县境内塔克拉玛干沙漠雪景美如画
  5. php图片抖动,css3,jquery_css3图片抖动,css3,jquery - phpStudy
  6. Java——多线程(铁路售票系统案例)
  7. 大牛手把手教你!2021大厂Java面试经历
  8. Criteria和DetachedCriteria区别应用
  9. echart x轴 倾斜_「技术帖」轮毂轴承单元轴铆合装配的铆头优化设计
  10. kafka修改分区数_ELK|kafka增加分区或调整副本数
  11. 课时5 企业Web服务器现场抓鸡案例分享
  12. 智能车改舵机中值步骤_智能车制作全过程(飞思卡尔)
  13. 论文-《Conversational Recommender System》
  14. HackTheGame 攻略 - 第一关
  15. Json及Jsoncpp开源库的应用
  16. vue swiper6版本 navigation不起作用小坑
  17. 应用容器引擎:docker的简介与安装
  18. Excel无法加载power pivot加载项
  19. atoi和strtol的区别和使用
  20. 如何给pdf添加页码?

热门文章

  1. 数据分析师 Mysql练习题(附答案)
  2. git管理工具 linux,linux系统下使用流行的版本管理工具 Git
  3. 夺命雷公狗—玩转SEO---65---黑阔手法秒杀dede提升权重
  4. 组播屏幕共享、Android屏幕共享开发小结
  5. 【Java系列】斐波拉契数列
  6. IT公司都不喜欢招培训班出来的学生,那培训班的意义何在呢?
  7. 局域网联机_343分享大量《光环 无限》情报 本地分屏与局域网联机都不会少
  8. java structs_Structs2 Action使用
  9. 游戏设计与开发_Unity游戏开发——设计模式概述
  10. 【QT】使用QML构建一个简易的计算器界面(一)