Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用Python进行主成分分析_Python - Fatal编程技术网

用Python进行主成分分析

用Python进行主成分分析,python,Python,这里是2D散射数据的示例 但当我画特征向量时, 绘图被压缩成一维图像 我试图对温度和应变数据进行主成分分析 为什么我有一个1D向量,散射和特征向量的组合 def process_data_PCA(temperature, strain): print("process data") T1 = temperature['T1'].tolist() T2 = temperature['T2'].tolist() T3 = temperature['T3'].tolis

这里是2D散射数据的示例 但当我画特征向量时, 绘图被压缩成一维图像

我试图对温度和应变数据进行主成分分析

为什么我有一个1D向量,散射和特征向量的组合

def process_data_PCA(temperature, strain):
    print("process data")
    T1 = temperature['T1'].tolist()
    T2 = temperature['T2'].tolist()
    T3 = temperature['T3'].tolist()
    T4 = temperature['T4'].tolist()
    T5 = temperature['T5'].tolist()
    T6 = temperature['T6'].tolist()
    T7 = temperature['T7'].tolist()
    T8 = temperature['T8'].tolist()
    T9 = temperature['T9'].tolist()
    T10 = temperature['T10'].tolist()

    W_A1 = strain[0]
    N = len(T1)
    xData =  T1
    yData =  W_A1
    xData = np.reshape(xData, (N, 1))
    yData = np.reshape(yData, (N, 1))

    data = np.hstack((xData, yData))
    print(data)
    mu = data.mean(axis=0)
    data = data - mu
    # data = (data - mu)/data.std(axis=0)  # Uncommenting this reproduces mlab.PCA results
    eigenvectors, eigenvalues, V = np.linalg.svd(data.T, full_matrices=False)
    projected_data = np.dot(data, eigenvectors)
    sigma = projected_data.std(axis=0).mean()
    print(eigenvectors)

    fig, ax = plt.subplots()
    ax.scatter(xData, yData, s= 0.1)
    for axis in eigenvectors:
        start, end = mu, mu + sigma * axis
        ax.annotate(
            '', xy=end, xycoords='data',
            xytext=start, textcoords='data',
            arrowprops=dict(facecolor='red', width=2.0))
    ax.set_aspect('equal')
    plt.show()
打印(数据)

特征向量 [-0.99999927 -0.00120856] [-0.00120856 0.9999927]

开始,结束

 1.95096698e+01 -5.70968943e-03] [ 1.7057429e+01 -8.6733643e-03]
[ 1.95096698e+01 -5.70968943e-03] [19.50670611  2.44653112]

你的问题似乎是轴的极限。注释不会更新轴限制信息,绘图仅使用数据限制(图像上的散点图)

我能够用代码手动生成您想要的绘图(函数plot_andre)


只需将轴限制设置为一些合适的值,如0-20和0-20。

在您的情况下,问题似乎是轴的限制。注释不会更新轴限制信息,绘图仅使用数据限制(图像上的散点图)

我能够用代码手动生成您想要的绘图(函数plot_andre)


只需将轴限制设置为一些合适的值,如0-20和0-20。

这里我测试了您的代码,我认为您的一个主要问题是直线
sigma=projected_data.std(axis=0.mean()
,要查看各个特征方向上的散射,您不需要
mean()
但在两个方向上都需要
std
的两个值。所以只要去掉平均值,就可以得到很好的pca图。我在下面用一些伪随机数测试了它

#data = np.hstack((xData, yData))
N = 8000
data = np.random.random((N,2))
########################################################################
# Random number in Ellipse
########################################################################
a = 0.5
b = 0.15
a2 = a**2
b2 = b**2
cx = 0.5
cy = 0.5
xData = []
yData = []
for i in range(N):
    if ((data[i,0]-cx)**2/a2+(data[i,1]-cy)**2/b2 -1.)<0:
        xData.append(data[i,0])
        yData.append(data[i,1])
##################################################
xData = np.array(xData)
yData = np.array(yData)
data = np.vstack((xData, yData)).T

mu = data.mean(axis=0)

data = data - mu
# data = (data - mu)/data.std(axis=0)  # Uncommenting this reproduces mlab.PCA results
eigenvectors, eigenvalues, V = np.linalg.svd(data.T, full_matrices=False)
projected_data = np.dot(data, eigenvectors)
print np.shape(projected_data)
############################################################
#sigma = projected_data.std(axis=0).mean()
# In this line, mean is removed
sigma = projected_data.std(axis=0)
############################################################
fig, ax = plt.subplots(figsize=(7,7))
ax.scatter(xData, yData, s= 0.1)
ax.scatter(mu[0],mu[1],s = 50,marker='*', c = 'r')
for axis,s in zip(eigenvectors,sigma):
    #start, end = mu, mu + sigma * axis
    start, end = mu, mu + s * axis
    ax.annotate(
        '', xy=end, xycoords='data',
        xytext=start, textcoords='data',
        arrowprops=dict(facecolor='red', width=2.0))
ax.set_aspect('equal')
plt.savefig("pcs.png")
plt.show()

#print eigenvalues
#data=np.hstack((扩展数据,yData))
N=8000
数据=np.random.random((N,2))
########################################################################
#椭圆中的随机数
########################################################################
a=0.5
b=0.15
a2=a**2
b2=b**2
cx=0.5
cy=0.5
扩展数据=[]
yData=[]
对于范围(N)中的i:

如果((数据[i,0]-cx)**2/a2+(数据[i,1]-cy)**2/b2-1.)这里我测试了你的代码,我认为你的一个主要问题是线
sigma=projected_data.std(axis=0).mean()
,要查看各自本征方向上的散射,你不需要
mean()
,但你需要两个本征方向上的
std
。所以只要去掉平均值,就可以得到很好的pca图。我在下面用一些伪随机数测试了它

#data = np.hstack((xData, yData))
N = 8000
data = np.random.random((N,2))
########################################################################
# Random number in Ellipse
########################################################################
a = 0.5
b = 0.15
a2 = a**2
b2 = b**2
cx = 0.5
cy = 0.5
xData = []
yData = []
for i in range(N):
    if ((data[i,0]-cx)**2/a2+(data[i,1]-cy)**2/b2 -1.)<0:
        xData.append(data[i,0])
        yData.append(data[i,1])
##################################################
xData = np.array(xData)
yData = np.array(yData)
data = np.vstack((xData, yData)).T

mu = data.mean(axis=0)

data = data - mu
# data = (data - mu)/data.std(axis=0)  # Uncommenting this reproduces mlab.PCA results
eigenvectors, eigenvalues, V = np.linalg.svd(data.T, full_matrices=False)
projected_data = np.dot(data, eigenvectors)
print np.shape(projected_data)
############################################################
#sigma = projected_data.std(axis=0).mean()
# In this line, mean is removed
sigma = projected_data.std(axis=0)
############################################################
fig, ax = plt.subplots(figsize=(7,7))
ax.scatter(xData, yData, s= 0.1)
ax.scatter(mu[0],mu[1],s = 50,marker='*', c = 'r')
for axis,s in zip(eigenvectors,sigma):
    #start, end = mu, mu + sigma * axis
    start, end = mu, mu + s * axis
    ax.annotate(
        '', xy=end, xycoords='data',
        xytext=start, textcoords='data',
        arrowprops=dict(facecolor='red', width=2.0))
ax.set_aspect('equal')
plt.savefig("pcs.png")
plt.show()

#print eigenvalues
#data=np.hstack((扩展数据,yData))
N=8000
数据=np.random.random((N,2))
########################################################################
#椭圆中的随机数
########################################################################
a=0.5
b=0.15
a2=a**2
b2=b**2
cx=0.5
cy=0.5
扩展数据=[]
yData=[]
对于范围(N)中的i:

如果((数据[i,0]-cx)**2/a2+(数据[i,1]-cy)**2/b2-1。)您能显示
打印(数据)
打印(特征向量)
的输出吗?您对数据使用PCA的方式是否正确?我的意思是,你只把T1作为扩展数据,然后把应变作为ydata。因为我们不知道数组的大小,所以我不知道输出是否错误。@hadik我打印了data@msi_gervax,y的数组大小相同data@msi_gerva这两种方法都是有效的。您能否显示
打印(数据)
打印(特征向量)
的输出?您是否以正确的方式对数据使用PCA?我的意思是,你只把T1作为扩展数据,然后把应变作为ydata。因为我们不知道数组的大小,所以我不知道输出是否错误。@hadik我打印了data@msi_gervax,y的数组大小相同data@msi_gerva这两种方法都很有效。你知道如何根据温度对数据建模和预测应变吗?关于如何做到这一点有什么信息吗?非常感谢你的帮助。你知道如何根据温度对数据建模和预测应变吗?关于如何做到这一点的任何信息?如何导入cvs文件并对其进行分析?如何导入cvs文件并对其进行分析?
#data = np.hstack((xData, yData))
N = 8000
data = np.random.random((N,2))
########################################################################
# Random number in Ellipse
########################################################################
a = 0.5
b = 0.15
a2 = a**2
b2 = b**2
cx = 0.5
cy = 0.5
xData = []
yData = []
for i in range(N):
    if ((data[i,0]-cx)**2/a2+(data[i,1]-cy)**2/b2 -1.)<0:
        xData.append(data[i,0])
        yData.append(data[i,1])
##################################################
xData = np.array(xData)
yData = np.array(yData)
data = np.vstack((xData, yData)).T

mu = data.mean(axis=0)

data = data - mu
# data = (data - mu)/data.std(axis=0)  # Uncommenting this reproduces mlab.PCA results
eigenvectors, eigenvalues, V = np.linalg.svd(data.T, full_matrices=False)
projected_data = np.dot(data, eigenvectors)
print np.shape(projected_data)
############################################################
#sigma = projected_data.std(axis=0).mean()
# In this line, mean is removed
sigma = projected_data.std(axis=0)
############################################################
fig, ax = plt.subplots(figsize=(7,7))
ax.scatter(xData, yData, s= 0.1)
ax.scatter(mu[0],mu[1],s = 50,marker='*', c = 'r')
for axis,s in zip(eigenvectors,sigma):
    #start, end = mu, mu + sigma * axis
    start, end = mu, mu + s * axis
    ax.annotate(
        '', xy=end, xycoords='data',
        xytext=start, textcoords='data',
        arrowprops=dict(facecolor='red', width=2.0))
ax.set_aspect('equal')
plt.savefig("pcs.png")
plt.show()

#print eigenvalues