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

一、实验目的

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

二、实验内容

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个变量,他们包含了原始变量的大部分信息。

  • 10
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
成分分析(Principal Component Analysis,PCA)是一种常用的特征提取方法。它通过线性变换将原始数据投影到一个新的坐标系中,使得投影后的数据具有最大的方差。这些新的坐标轴被称为成分,它们是原始数据中最能区分样本之间差异的方向。 PCA的基本思想是找到一个最佳的投影方向,使得数据在该方向上的投影具有最大的方差,然后找到一个与第一个方向正交的第二个方向,使得数据在该方向上的投影具有次大的方差,依此类推。通过选择前k个成分,就可以将原始数据降维到k维空间中。 PCA具有以下几个应用和优点: 1. 数据降维:通过PCA可以将高维数据降低到低维空间,减少特征数量,同时保留了原始数据中最重要的信息。 2. 去除冗余信息:PCA可以去除原始数据中的冗余信息,提取出最相关的特征。 3. 数据可视化:PCA可以将高维数据映射到二维或三维空间中,便于可视化观察和分析。 4. 数据预处理:PCA可以在机器学习任务前对数据进行预处理,减少噪声和冗余信息对模型的影响。 5. 特征选择:基于PCA的方差解释率,可以选择保留多少个成分,从而选择最具代表性的特征。 需要注意的是,PCA是一种线性降维方法,对于非线性的数据分布效果可能不好。在这种情况下,可以考虑使用非线性降维方法,如核成分分析(Kernel PCA)等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值