1500字范文,内容丰富有趣,写作好帮手!
1500字范文 > 主成分分析 SPSS python实例分析

主成分分析 SPSS python实例分析

时间:2021-01-07 23:01:02

相关推荐

主成分分析 SPSS python实例分析

今天,在西瓜书上看到了主成分分析法,之前建模有接触过但是理解不够深刻,今天再次和这一位老朋友聊聊。

主成分分析(Principal Component Analysis,PCA), 是一种统计方法。通过正交变换将一组可能存在相关性的变量转换为一组线性不相关的变量,转换后的这组变量叫主成分。

主成分分析,是考察多个变量间相关性一种多元统计方法,研究如何通过少数几个主成分来揭示多个变量间的内部结构,即从原始变量中导出少数几个主成分,使它们尽可能多地保留原始变量的信息,且彼此间互不相关.通常数学上的处理就是将原来P个指标作线性组合,作为新的综合指标。

简单说,主成分分析的作用是降维。通过降维将原来多变量解释的问题,映射到更少指标,转换成少变量的可解释性问题。但是注意经过主成分分析后的变量与原变量不存在逻辑关系,仅仅是存在线性组合的关系。[1]

一、算法原理:

输入:样本集D={x1,x2...xm};

低维空间维数d'.

过程:

1.对所有样本进行中心化:

2.计算样本的协方差矩阵XXT;

3.对协方差矩阵XXT做特征值分解;

4.取最大的d'个特征值所对应的特征向量w1,w2...wd';

输出:投影矩阵W*=(w1,w2...wd') .[2]

二、PCA原理

三、SPSS进行主成分分析

由于SPSS本身就是一个用于数据分析的软件,因此操作简单无需编程,即可直观感受主成分分析带来的效果。

先胡乱编制了一些数据:

在SPSS里,点击分析->降维->因子,在弹出的对话框中,将需要分析的变量都送入变量栏中。根据个人需要在描述、提取、旋转、得分、选项中勾选。此处我们注意在提取勾选主成分。

点击“确定”:

最后我们可以看到提取了两个主成分

观察两个主成分中的贡献率,我们会发现第一个主成分包含贡献率较高的项为数学、物理、化学、生物,实际意义即理科,第二主成分包含历史、地理,即文科。具有良好解释性。

四、python代码实现主成分分析

pca.py

# -*- coding: utf-8 -*-"""Created on Sun Feb 28 10:04:26 PCA source code@author: liudiwei"""import numpy as npimport pandas as pdimport matplotlib.pyplot as plt#计算均值,要求输入数据为numpy的矩阵格式,行表示样本数,列表示特征 def meanX(dataX):return np.mean(dataX,axis=0)#axis=0表示按照列来求均值,如果输入list,则axis=1#计算方差,传入的是一个numpy的矩阵格式,行表示样本数,列表示特征 def variance(X):m, n = np.shape(X)mu = meanX(X)muAll = np.tile(mu, (m, 1)) X1 = X - muAllvariance = 1./m * np.diag(X1.T * X1)return variance#标准化,传入的是一个numpy的矩阵格式,行表示样本数,列表示特征 def normalize(X):m, n = np.shape(X)mu = meanX(X)muAll = np.tile(mu, (m, 1)) X1 = X - muAllX2 = np.tile(np.diag(X.T * X), (m, 1))XNorm = X1/X2return XNorm"""参数:- XMat:传入的是一个numpy的矩阵格式,行表示样本数,列表示特征 - k:表示取前k个特征值对应的特征向量返回值:- finalData:参数一指的是返回的低维矩阵,对应于输入参数二- reconData:参数二对应的是移动坐标轴后的矩阵""" def pca(XMat, k):average = meanX(XMat) m, n = np.shape(XMat)data_adjust = []avgs = np.tile(average, (m, 1))data_adjust = XMat - avgscovX = np.cov(data_adjust.T) #计算协方差矩阵featValue, featVec= np.linalg.eig(covX) #求解协方差矩阵的特征值和特征向量index = np.argsort(-featValue) #按照featValue进行从大到小排序finalData = []if k > n:print("k must lower than feature number")returnelse:#注意特征向量时列向量,而numpy的二维矩阵(数组)a[m][n]中,a[1]表示第1行值selectVec = np.matrix(featVec.T[index[:k]]) #所以这里需要进行转置finalData = data_adjust * selectVec.T reconData = (finalData * selectVec) + average return finalData, reconDatadef loaddata(datafile):return np.array(pd.read_csv(datafile,sep="\t",header=-1)).astype(np.float)def plotBestFit(data1, data2): dataArr1 = np.array(data1)dataArr2 = np.array(data2)m = np.shape(dataArr1)[0]axis_x1 = []axis_y1 = []axis_x2 = []axis_y2 = []for i in range(m):axis_x1.append(dataArr1[i,0])axis_y1.append(dataArr1[i,1])axis_x2.append(dataArr2[i,0]) axis_y2.append(dataArr2[i,1]) fig = plt.figure()ax = fig.add_subplot(111)ax.scatter(axis_x1, axis_y1, s=50, c='red', marker='s')ax.scatter(axis_x2, axis_y2, s=50, c='blue')plt.xlabel('x1'); plt.ylabel('x2');plt.savefig("outfile.png")plt.show()#简单测试#数据来源:/jerrylead/archive//04/18/209.htmldef test():X = [[2.5, 0.5, 2.2, 1.9, 3.1, 2.3, 2, 1, 1.5, 1.1],[2.4, 0.7, 2.9, 2.2, 3.0, 2.7, 1.6, 1.1, 1.6, 0.9]]XMat = np.matrix(X).T k = 2return pca(XMat, k)#根据数据集data.txtdef main(): datafile = "data.txt"XMat = loaddata(datafile)k = 2return pca(XMat, k)if __name__ == "__main__":finalData, reconMat = main()plotBestFit(finalData, reconMat)

data.txt

5.13.51.40.24.93.01.40.24.73.21.30.24.63.11.50.25.03.61.40.25.43.91.70.44.63.41.40.35.03.41.50.24.42.91.40.24.93.11.50.15.43.71.50.24.83.41.60.24.83.01.40.14.33.01.10.15.84.01.20.25.74.41.50.45.43.91.30.45.13.51.40.35.73.81.70.35.13.81.50.35.43.41.70.25.13.71.50.44.63.61.00.25.13.31.70.54.83.41.90.25.03.01.60.25.03.41.60.45.23.51.50.25.23.41.40.24.73.21.60.24.83.11.60.25.43.41.50.45.24.11.50.15.54.21.40.24.93.11.50.15.03.21.20.25.53.51.30.24.93.11.50.14.43.01.30.25.13.41.50.25.03.51.30.34.52.31.30.34.43.21.30.25.03.51.60.65.13.81.90.44.83.01.40.35.13.81.60.24.63.21.40.25.33.71.50.25.03.31.40.27.03.24.71.46.43.24.51.56.93.14.91.55.52.34.01.36.52.84.61.55.72.84.51.36.33.34.71.64.92.43.31.06.62.94.61.35.22.73.91.45.02.03.51.05.93.04.21.56.02.24.01.06.12.94.71.45.62.93.61.36.73.14.41.45.63.04.51.55.82.74.11.06.22.24.51.55.62.53.91.15.93.24.81.86.12.84.01.36.32.54.91.56.12.84.71.26.42.94.31.36.63.04.41.46.82.84.81.46.73.05.01.76.02.94.51.55.72.63.51.05.52.43.81.15.52.43.71.05.82.73.91.26.02.75.11.65.43.04.51.56.03.44.51.66.73.14.71.56.32.34.41.35.63.04.11.35.52.54.01.35.52.64.41.26.13.04.61.45.82.64.01.25.02.33.31.05.62.74.21.35.73.04.21.25.72.94.21.36.22.94.31.35.12.53.01.15.72.84.11.36.33.36.02.55.82.75.11.97.13.05.92.16.32.95.61.86.53.05.82.27.63.06.62.14.92.54.51.77.32.96.31.86.72.55.81.87.23.66.12.56.53.25.12.06.42.75.31.96.83.05.52.15.72.55.02.05.82.85.12.46.43.25.32.36.53.05.51.87.73.86.72.27.72.66.92.36.02.25.01.56.93.25.72.35.62.84.92.07.72.86.72.06.32.74.91.86.73.35.72.17.23.26.01.86.22.84.81.86.13.04.91.86.42.85.62.17.23.05.81.67.42.86.11.97.93.86.42.06.42.85.62.26.32.85.11.56.12.65.61.47.73.06.12.36.33.45.62.46.43.15.51.86.03.04.81.86.93.15.42.16.73.15.62.46.93.15.12.35.82.75.11.96.83.25.92.36.73.35.72.56.73.05.22.36.32.55.01.96.53.05.22.06.23.45.42.35.93.05.11.8

代码运行结果:

参考文献:

[1]/item/%E4%B8%BB%E6%88%90%E5%88%86%E5%88%86%E6%9E%90/829840?fr=aladdin

[2]周志华,机器学习,清华大学出版社,1月1版.

-03-09

00:05:40

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。