用Python进行主成分分析
这里是2D散射数据的示例 但当我画特征向量时, 绘图被压缩成一维图像 我试图对温度和应变数据进行主成分分析 为什么我有一个1D向量,散射和特征向量的组合用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
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