高维数据PCA降维可视化(KNN分类)

news/2024/7/9 11:21:01 标签: 数据挖掘, 数据分析, 机器学习, sklearn, python

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

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

代码实现

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

python">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 += 1
        print('预测:', 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)为一个特征

归一化

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

x_{normalization}=\frac{x - x_{min}}{x_{max} - x_{min}}

python"># 坐标归一化,统一尺度
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降维

python"># 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预测

python"># 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 += 1
        print('预测:', predict[0], '真实:', raw_points[:1])

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

可视化

python"># 用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


http://www.niftyadmin.cn/n/1093579.html

相关文章

ubuntu1704入门教程(一)下载安装

很早很早以前,就听说过linux的大名了,但是只是膜拜,一直没有去learning,现在用到了,才会去下载安装,现在,讲一下我遇到的坑。新手什么都不会,什么都不懂,人也比较笨&…

OpenCV-Python 颜色识别(红色)并拟合矫正目标区域

OpenCV版本:4.6.0.66 算法实现思路: 颜色识别(红色)形态学去噪轮廓检测多边形拟合透视矫正代码实现: import cv2 import numpy as np# 可视化 def img_show(name, img):cv2.namedWindow(name, 0)cv2.resizeWindow(name, 1000, 500)cv2.imsh…

libmad使用一步步进阶

原文地址:http://my.oschina.net/mjRao/blog/57874 libmad是一个开源mp3解码库,其对mp3解码算法做了很多优化,性能较好,很多播放器如mplayer、xmms等都是使用这个开源库进行解码的;如果要设计mp3播放器而又不想研究mp…

log4j2入门教程(二)简介2(propreties配置)

1.简介2(1)Log4j是什么?log4j是一个由Java编写的,可靠、快速和灵活的日志框架(API),它是Apache下的一个开源项目。又是Apache,我表示他们实在是比较强大,很多开源软件都是…

读取*.wav音频文件

1、wav音频文件的格式 wav文件由文件头和采样数据2部分组成。 文件头又分为RIFF(Resource Interchange File Format)、WAVE文件标识段 和 声音数据格式说明段组成。 各段的起始地址分别由RIFF标识符、WAVE标识符、以及波形格式标识符(FMT&…

CentOS、Ubuntu、Debian三个linux比较异同[转]

Linux有非常多的发行版本,从性质上划分,大体分为由商业公司维护的商业版本与由开源社区维护的免费发行版本。 商业版本以Redhat为代表,开源社区版本则以debian为代表。这些版本各有不同的特点,在不同的应用领域发挥着不同的作用&a…

函数返回类型为指针类型时的一些问题

原文出处&#xff1a;http://blog.csdn.net/tigerjb/article/details/7425571#comments 1.先看程序&#xff1a; #include<stdio.h> char *returnStr() {char *p “tigerjibo”;return p; } int main() {char*str;str returnStr();//str[0]’T’;则会引起错误&#x…

模拟电路一-----模拟电路用途

1. 转载于:https://www.cnblogs.com/cui0x01/p/6377516.html