写一个基于随机梯度下降的PCA代码,生成样本并绘制相应图像输出结果
时间: 2023-05-29 22:02:12 浏览: 90
import numpy as np
import matplotlib.pyplot as plt
# 生成样本数据
x1 = np.random.normal(loc=0.0, scale=1.0, size=100)
x2 = 0.4 * x1 + np.random.normal(loc=0.0, scale=0.5, size=100)
x3 = 0.3 * x1 + 0.6 * x2 + np.random.normal(loc=0.0, scale=0.2, size=100)
X = np.vstack([x1, x2, x3]).T
# 随机梯度下降 PCA
def sgd_pca(X, n_components=2, learning_rate=0.01, n_epochs=100):
# 初始化权重向量
w = np.random.normal(size=(X.shape[1], n_components))
# 进行多次随机梯度下降迭代
for epoch in range(n_epochs):
for i in range(X.shape[0]):
# 随机选择一个样本
sample = X[[i], :]
# 计算梯度
# (sample * w)为矩阵乘法 Dot Product
# dW的形状应该是(3,2)
# dW = - (sample * w) * sample.T
dW = -np.dot(sample, w) * sample.T
# 更新权重向量
w -= learning_rate * dW
# 输出当前迭代次数
print("Epoch: ", epoch)
# 将数据投影到新空间
P = np.dot(X, w)
return P, w
# 进行PCA
P, W = sgd_pca(X)
# 画出原始数据点
fig = plt.figure(figsize=(10, 7))
ax = fig.add_subplot(111, projection='3d')
ax.scatter(X[:, 0], X[:, 1], X[:, 2], marker='o')
ax.set_xlabel('X Label')
ax.set_ylabel('Y Label')
ax.set_zlabel('Z Label')
ax.set_title('Original Data')
plt.show()
# 画出PCA结果
fig = plt.figure(figsize=(10, 7))
plt.scatter(P[:, 0], P[:, 1], marker='o')
plt.xlabel('PC1')
plt.ylabel('PC2')
plt.title('PCA Results')
plt.show()
阅读全文