Skip to main content

降维算法

降维算法

作为一名数据科学家,我们手上的数据有非常多的特征。

虽然这听起来有利于建立更强大精准的模型,但它们有时候反倒也是建模中的一大难题。

怎样才能从 1000 或 2000 个变量里找到最重要的变量呢?

这种情况下降维算法及其他算法,如决策树,随机森林,PCA,因子分析,相关矩阵,和缺省值比例等,就能帮我们解决难题。

from sklearn.decomposition import PCA
import numpy as np

# 创建一些示例数据
X = np.array([[1, 2, 3],
[2, 3, 4],
[3, 4, 5],
[4, 5, 6]]) # 特征矩阵

# 创建PCA降维模型
n_components = 2 # 指定要降维到的维度
model = PCA(n_components=n_components)

# .fit_transform()方法可以拟合数据,同时进行降维
X_reduced = model.fit_transform(X)

print("原始数据形状:", X.shape)
print("降维后数据形状:", X_reduced.shape)
print("降维后数据:")
print(X_reduced)

简单示例

from sklearn.decomposition import PCA
from sklearn.datasets import load_iris
# 加载数据
iris = load_iris()
iris_X = iris.data
iris_y = iris.target

# 创建PCA降维模型
# 分别降维到2维和3维
model2 = PCA(n_components=2)
model3 = PCA(n_components=3)

# 拟合模型并进行降维
X_reduced2 = model2.fit_transform(iris_X)
X_reduced3 = model3.fit_transform(iris_X)

print(X_reduced2)
print(X_reduced3)

效果评估

print("原始数据形状:", iris_X.shape)
print("降维后数据形状:", X_reduced2.shape)
print("降维后数据形状:", X_reduced3.shape)
print("降维后数据:")
print(X_reduced2)
print(X_reduced3)

效果评估

print("原始数据形状:", iris_X.shape)
print("降维后数据形状:", X_reduced2.shape)
print("降维后数据形状:", X_reduced3.shape)
print("降维后数据:")
print(X_reduced2)
print(X_reduced3)

二维可视化结果

import matplotlib.pyplot as plt
import pandas as pd

#方法1,直接绘制,自动分配颜色
plt.scatter(X_reduced2[:, 0], X_reduced2[:, 1], c=iris_y)
# plt.show()方法会把图像显示出来并清空画布
plt.show()

#方法2,指定RGB颜色,再绘制
color={0:'#1f77b4',1:'#ff7f0e',2:'#2ca02c'}
# 列表推导式,如果i在color中,就返回color[i],否则返回i
colors = [color[i] if i in color else i for i in iris_y]
# 绘制散点图,x轴为X_reduced2[:, 0],y轴为X_reduced2[:, 1],颜色为colors
plt.scatter(X_reduced2[:, 0], X_reduced2[:, 1], c=colors)
# plt.show()方法会把图像显示出来并清空画布
plt.show()

# 方法3
# 我们希望把3种不同类型的数据通过设置不同的颜色和形状来把他们区分开来
# r^表示红色的三角形,gx表示绿色的叉号,bo表示蓝色的圆点
color={0:'r^',1:'gx',2:'bo'}
# 列表推导式,如果i在color中,就返回color[i],否则返回i
colors = [color[i] if i in color else i for i in iris_y]
data = pd.DataFrame(zip(X_reduced2[:, 0],
X_reduced2[:, 1],
colors),
columns=['x','y','label'])
# 按照label列进行分组
for i in data.groupby('label'):
x = i[1]['x']
y = i[1]['y']
c = i[0]
plt.plot(x, y,c)
# plt.show()方法会把图像显示出来并清空画布
plt.show()

# 相比于之前课程中直接绘制原始数据,降维后的数据更加容易区分。

三维可视化结果

import matplotlib.pyplot as plt

fig = plt.figure()
# 创建一个3d的画布
ax = fig.add_subplot(projection='3d')

# 从降维后的数据中取出x、y、z三个维度
xs = list(X_reduced3[:, 0])
ys = list(X_reduced3[:, 1])
zs = list(X_reduced3[:, 2])
# 把分类的0、1、2替换为绿色、红色、蓝色
color={0:'green',1:'red',2:'blue'}
colors = [color[i] if i in color else i for i in iris_y]

for x, y, z, c in zip(xs, ys, zs, colors):
# 绘制散点图
ax.scatter(x, y, z, c=c)
plt.show()