机器学习案例练习——主成分分析

本文介绍了如何使用Python和相关库(如numpy、pandas)对UCIMachineLearningRepository中的CPU性能数据集进行主成分分析,以降低维度并保留90%的信息。实验过程包括数据加载、预处理、特征值计算和降维操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、实验目的

了解主成分分析算法的基本思想、实现步骤,并用代码实现。

二、实验内容

CPU数据集是加州大学欧文分校机器学习数据库(UC irvine machine learning repository,网址为http://archive.ics.uci.edu/ml/)中的一个,名为computer hardware,或者CPU performance,缩写为CPU(“machine.data”文件中为数据,“machine.names”文件中为数据说明)。该数据完整版包括209个样本,每个样本有10个属性,选择其中的6个数值属性,如表1所示,这是该数据集的一个子集。

在这里插入图片描述

对该数据集利用主成分分析属性选择方法,为此包含6个属性值209个样本的数据集进行属性提取(用原始属性的线性组合表达),累积贡献率设为90%。

三、实验代码以及结果:



import numpy as np
import pandas as pd
# 绘图
import seaborn as sns
import matplotlib.pyplot as plt
from factor_analyzer.factor_analyzer import calculate_bartlett_sphericity
from factor_analyzer.factor_analyzer import calculate_kmo
from sklearn import preprocessing

def loadData(fn):
    data = pd.read_csv(fn,sep=',',names=['vendor_name','Model','MYCT','MMIN','MMAX','CACH','CHMIN','CHMAX','PRP','ERP'])
    print(data)
    return data
'''进行球形检验'''
def Bartlett(df):
    chi_square_value,p_value = calculate_bartlett_sphericity(df)
    print("球形检验卡方、P值:",chi_square_value,p_value)
'''KMO检验'''
def KMO(df):
    kmo_all,kmo_model = calculate_kmo(df)
    print("KMO检验:",kmo_all)
'''求相关矩阵'''
def RelationMatrix(df):
    zdf = preprocessing.scale(df)     # 进行标准化
    print("标准化后的矩阵:\n",zdf)
    print(zdf.shape)
    print("*********************")
    covZ = np.around(np.corrcoef(zdf.T),decimals=3)
    print(covZ.shape)
    print(covZ)
    return covZ

'''求解特征值和特征向量'''
def FeatureValVec(relationMatrix):
    featVal,featVec = np.linalg.eig(relationMatrix)

    sortfeatVal = sorted(featVal)[::-1]
    sortfeatVec = np.zeros(featVec.shape)

    k = 0
    for val in sortfeatVal:
        print("val:",val)
        i = list(featVal).index(val)
        sortfeatVec[k] = featVec[i]
        k = k+1
    return featVal,featVec

'''求均值'''
def MeanX(dataX):
    return np.mean(dataX,axis=0)



if __name__ == "__main__":
    fn = 'D:\For_Study\BusinessIntelligent\Exp4_PCA\machine.data'
    df = loadData(fn)
    # 选出相应的列
    df_part = df[['MYCT','MMIN','MMAX','CACH','CHMIN','CHMAX','PRP','ERP']]
    average = MeanX(df_part)
    cov = RelationMatrix(df_part)
    featval,featvec = FeatureValVec(cov)    #计算特征值、特征向量
    print("特征值:",featval)
    print("特征向量:",featvec)
    # 绘制散点图和折线图
    plt.scatter(range(1,df_part.shape[1]+1),featval)
    plt.plot(range(1,df_part.shape[1]+1),featval)

    plt.title("scree Plot")
    plt.xlabel("Factors")
    plt.ylabel("Eigenvalue")
    plt.grid()
    plt.show()

    # 求特征值的贡献度
    gx = featval/np.sum(featval)
    print("各特征根的贡献度:",gx)
    # 求特征值的累计贡献度
    lg = np.cumsum(gx)
    print("各特征根的累计贡献度:",lg)

    # 选出主成分
    k = [i for i in range(len(lg)) if lg[i] <= 0.90]
    if lg[len(k)-1] < 0.90:
        k.append(len(k))
    k = list(k)
    print("选出的主成分:",k)

    # 选出主成分对应的特征向量矩阵
    selectVec = np.matrix(featvec.T[k]).T
    selectVe = selectVec*(-1)
    print("主成分对应的特征向量:",selectVec)

    # 主成分得分
    finalData = np.dot(df_part,selectVec)
    print(finalData)

四、小结

本次实验完成了python主成分分析的实现,涉及了较多numpy库中一些函数的使用以及pandas读取文件的内容。主成分分析的主要目的是为了降维,如上题所示,通过降维将8个变量降成了4个变量,他们包含了原始变量的大部分信息。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值