无监督学习-主成分分析和聚类分析

聚类分析(cluster analysis)是将一组研究对象分为相对同质的群组(clusters)的统计分析技术,即将观测对象的群体按照相似性和相异性进行不同群组的划分,划分后每个群组内部各对象相似度很高,而不同群组之间的对象彼此相异度很高。

回归、分类、聚类的区别 :

  • 有监督学习 --->> 回归、分类    /   无监督学习  --->>聚类
  • 回归 -->>产生连续结果,可用于预测
  • 分类 -->>产生连续结果,可用于预测
  • 聚类 -->>产生一组集合,可用于降维

一、PCA主成分分析

 

二、PCA主成分的python实现方法

通过sklearn的PCA类实现,from sklearn.decomposition import PCA

pca = PCA(n_components=1) # n_components参数表示最终维度

pca.fit(data) #创建模型

data_pca = pca.transform(data) #降维,创建模型和降维可通过一步实现fit_transform

data_inverse = pca.inverse_transform(data_pca) #根据降维结果反算原始数据

1.二维数据降维

rng = np.random.RandomState(8)
data = np.dot(rng.rand(2,2),rng.randn(2,200)).T  #矩阵相乘
df = pd.DataFrame({'X1':data[:,0],'X2':data[:,1]})
print(df.shape)
print(df.head())
plt.scatter(df['X1'],df['X2'],alpha = 0.8,marker = '.')
plt.axis('equal')  #坐标轴每个单位表示的刻度相同
# (200, 2)
#          X1        X2
# 0 -1.174787 -1.404131
# 1 -1.374449 -1.294660
# 2 -2.316007 -2.166109
# 3  0.947847  1.460480
# 4  1.762375  1.640622

from sklearn.decomposition import PCA
pca = PCA(n_components=1) # n_components参数表示最终维度
pca.fit(df)
print(pca.explained_variance_)
print(pca.components_)
# print(pca.n_components) #返回保留的成分个数
# print(pca.explained_variance_ratio_) 
# 结果降为几个维度,就有几个特征值;原始数据有几个维度,就有几个特征向量
# explained_variance_:特征值
# components_:返回具有最大方差的成分,即特征向量

# 这里是shape(200,2)降为shape(200,1),只有1个特征值,对应2个特征向量
# 降维后主成分 A1 = 0.7788006 * X1 + 0.62727158 * X2
# 成分的结果值 = 2.80 * (-0.77*x1 -0.62 * x2) #通过这个来筛选它的主成分

df_pca = pca.transform(df)  # 数据转换,将原始二维数据转换为降维后的一维数据
df_inverse = pca.inverse_transform(df_pca)  # 数据转换,将降维后的一维数据转换成原始的二维数据
print('original shape:',df.shape)
print('transformed shape:',df_pca.shape)
print(df.head(10))
print(df_pca[:10])
print(df_inverse[:10])

plt.scatter(df['X1'],df['X2'], alpha = 0.8, marker = '.') #原始数据散点;
plt.scatter(x_inverse[:,0],x_inverse[:,1], alpha = 0.8, marker = '.',color = 'r') #转换之后的散点,红色的就是最后的特征数据
plt.axis('equal')

2.多维数据降维

 多维数据降维,使用自带的图像数据进行测试。

from sklearn.datasets import load_digits
digits = load_digits()
print(type(digits))
print(digits.data[:2])
print('数据长度为:%i条' % len(digits['data']))
print('数据形状为:',digits.data.shape) #总共1797条数据,每条数据有64个变量
print('字段:',digits.keys())
print('分类(数值):',digits.target)
print('分类(名称):',digits.target_names)

 

将上述数据由64维降为2维,降维后的2个维度肯定都是主成分。

pca = PCA(n_components=2)  #降为2维
projected = pca.fit_transform(digits.data)  #相当于先fit构建模型,再transform进行转换
projected[:2]
print('original shape:',digits.data.shape)
print('transformed shape:',projected.shape)
print('特征值',pca.explained_variance_)  #2个特征值
print('特征向量',pca.components_.shape) #2个成分,每个成分都有64个特征向量

# original shape: (1797, 64)
# transformed shape: (1797, 2)
# 特征值 [179.0069301  163.71774688]
# 特征向量 (2, 64)
plt.scatter(projected[:,0],projected[:,1],s = 10,c = digits.target, cmap='Reds',edgecolor = 'none',alpha = 0.5)
plt.colorbar()

 

将上述数据降为10维,并求主要成分。

pca = PCA(n_components=10)  #降为10维
projected = pca.fit_transform(digits.data)  #相当于先fit构建模型,再transform进行转换
projected[:2]
print('original shape:',digits.data.shape)
print('transformed shape:',projected.shape)
print(pca.explained_variance_)  # 输出特征值 ;10个特征值
print(pca.components_.shape)  # 输出特征向量形状

s = pca.explained_variance_
c_s = pd.DataFrame({'x':s,'x_cumsum':s.cumsum()/s.sum()})
print(c_s)
c_s['x_cumsum'].plot(style = '--ko', figsize = (10,4))
plt.axhline(0.85,color='r',linestyle="--",alpha=0.8)  
plt.text(6,c_s['x_cumsum'].iloc[6]-0.1,'第7个成分累计贡献率超过85%',color = 'r')
plt.grid()

   

 

三、K-means聚类的python实现方法

K-means聚类是最常用的机器学习聚类算法,且为典型的基于距离的聚类算法。主要步骤为:

kmeans = KMeans(n_clusters=4) #创建模型

kmeans.fit(x) #导入数据

y_kmeans = kmeans.predict(x) #预测每个数据属于哪个类

centroids = kmeans.cluster_centers_ #每个类的中心点

 先使用sklearn自带的生成器生成数据

from sklearn.datasets.samples_generator import make_blobs  # make_blobs聚类数据生成器
x,y_true = make_blobs(n_samples=300,centers=4,cluster_std=0.5,random_state=0)
print(x[:5])
print(y_true[:5])

# n_samples 生成的样本总数
# centers 类别数
# cluster_std 每个类别的方差,如果多类数据不同方差可设置为[std1,std2,...stdn]
# random_state 随机数种子
# x 生成的数据,y 数据对应的类别
# n_features 每个样本的特征数

plt.scatter(x[:,0],x[:,1],s=10,alpha=0.8)

   

通过sklearn的KMeans进行聚类分析

from sklearn.cluster import KMeans
kmeans = KMeans(n_clusters=4)  #创建模型
kmeans.fit(x)  #导入数据
y_kmeans = kmeans.predict(x)  #预测每个数据属于哪个类
centroids = kmeans.cluster_centers_ #每个类的中心点
plt.scatter(x[:,0],x[:,1],s=30,c=y_kmeans,cmap = 'Dark2',alpha=0.5,marker='x')
plt.scatter(centroids[:,0],centroids[:,1],s=70,c=[0,1,2,3],cmap = 'Dark2',marker='o')
plt.title('K-means 300 points')
plt.xlabel('value1')
plt.ylabel('value2')

 

posted @ 2019-08-20 22:16  Forever77  阅读(5239)  评论(0编辑  收藏  举报