数学模型:3.非监督学习--聚类分析 和K-means聚类

Posted shengyang17

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数学模型:3.非监督学习--聚类分析 和K-means聚类相关的知识,希望对你有一定的参考价值。

 1. 聚类分析

聚类分析(cluster analysis)是一组将研究对象分为相对同质的群组(clusters)的统计分析技术 ---->>

将观测对象的群体按照相似性和相异性进行不同群组的划分,划分后每个群组内部各对象相似度很高,而不同群组之间的对象彼此相异度很高。

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

  有监督学习 --->> 回归,分类    /   无监督学习  --->>聚类

  回归 -->>产生连续结果,可用于预测

  分类 -->>产生连续结果,可用于预测

  聚类 -->>产生一组集合,可用于降维。

本文主要介绍PCA主成分,K-means聚类

1.1 PCA主成分分析

 

技术分享图片

技术分享图片

技术分享图片

技术分享图片

技术分享图片

技术分享图片

技术分享图片

1.2 PCA主成分的python实现方法

PCA主成分分析的python实现方法

最广泛无监督算法 + 基础的降维算法
通过线性变换将原始数据变换为一组各维度线性无关的表示,用于提取数据的主要特征分量 → 高维数据的降维

二维数据降维 / 多维数据降维

 (1)二维数据降维

 

# 二维数据降维(二维降为一维只有1个特征值,2个特征向量)
# 构建模型,分析主成分

from sklearn.decomposition import PCA  
# 加载主成分分析模块PCA

pca = PCA(n_components = 1)  # n_components = 1 → 降为1维
pca.fit(df)  # 构建模型
# sklearn.decomposition.PCA(n_components=None, copy=True, whiten=False)  
# n_components:  PCA算法中所要保留的主成分个数n,也即保留下来的特征个数n
# copy: True或者False,默认为True → 表示是否在运行算法时,将原始训练数据复制一份
# fit(X,y=None) → 调用fit方法的对象本身。比如pca.fit(X),表示用X对pca这个对象进行训练
print(pca.explained_variance_) #特征值       [ 2.78300591]
print(pca.components_)#特征向量              [[ 0.7788006   0.62727158]]
print(pca.n_components) #主成分,成分的个数  1
#成分的结果值 = 2.78 * (0.77*x1 + 0.62 * x2)

# components_:返回具有最大方差的成分。
# explained_variance_ratio_:返回 所保留的n个成分各自的方差百分比。
# n_components_:返回所保留的成分个数n。

# 这里是shape(200,2)降为shape(200,1),只有1个特征值,对应2个特征向量
# 降维后主成分 A1 = 0.7788006 * X1 + 0.62727158 * X2

x_pca = pca.transform(df)
x_pca


x_pca = pca.transform(df)  # 数据转换
x_new = pca.inverse_transform(x_pca)  # 将降维后的数据转换成原始数据
print(original shape:,df.shape)
print(transformed shape:,x_pca.shape)
print(x_pca[:5])
print(-----)
# 主成分分析,生成新的向量x_pca
# fit_transform(X) → 用X来训练PCA模型,同时返回降维后的数据,这里x_pca就是降维后的数据
# inverse_transform() → 将降维后的数据转换成原始数据

技术分享图片

plt.scatter(df[X1],df[X2], alpha = 0.8, marker = .)
plt.scatter(x_new[:,0],x_new[:,1], alpha = 0.8, marker = .,color = r)
plt.axis(equal)
plt.grid()
# # 生成图表

技术分享图片

 

 (2)多维数据降维

# 多维数据降维 
# 加载数据

from sklearn.datasets import load_digits
digits = load_digits()
print(digits .keys())
print(数据长度为:%i条 % len(digits[data]))
print(数据形状为:%i条,digits.data.shape) #总共1797条数据,每条数据有64个变量
print(digits.data[:2])
# 导入数据

技术分享图片

# 多维数据降维 
# 构建模型,分析主成分

pca = PCA(n_components = 2)  # 降为2纬
projected = pca.fit_transform(digits.data)
print(original shape:,digits.data.shape)
print(transformed shape:,projected.shape)
projected[:5]

技术分享图片

 

print(pca.explained_variance_)  # 输出特征值
# print(pca.components_)  # 输出特征向量 ,64个特征向量  .shape是形状
#print(projected)  # 输出解析后数据
# 降维后,得到2个成分,每个成分有64个特征向量

plt.scatter(projected[:,0],projected[:,1],
           c = digits.target, edgecolor = none,alpha = 0.5,
           cmap = Reds,s = 5)
plt.axis(equal)
plt.grid()
plt.colorbar()
# 二维数据制图

技术分享图片

 

# 多维数据降维 
# 主成分筛选

pca = PCA(n_components = 10)  # 降为10纬
projected = pca.fit_transform(digits.data)
print(original shape:,digits.data.shape)
print(transformed shape:,projected.shape)
print(pca.explained_variance_)  # 输出特征值
print(pca.components_.shape)  # 输出特征向量形状
#print(projected)  # 输出解析后数据
# 降维后,得到10个成分,每个成分有64个特征向量

c_s = pd.DataFrame({b:pca.explained_variance_,
                   b_sum:pca.explained_variance_.cumsum()/pca.explained_variance_.sum()})
print(c_s)
# 做贡献率累计求和
# 可以看到第7个成分时候,贡献率超过85% → 选取前7个成分作为主成分

 

技术分享图片

 

c_s[b_sum].plot(style = --ko, figsize = (10,4))
plt.axhline(0.85,hold=None,color=r,linestyle="--",alpha=0.8)  
plt.text(6,c_s[b_sum].iloc[6]-0.08,第7个成分累计贡献率超过85%,color = r)
plt.grid()

技术分享图片

3. K-means聚类的python实现方法

最常用的机器学习聚类算法,且为典型的基于距离的聚类算法
K均值: 基于原型的、划分的距离技术,它试图发现用户指定个数(K)的簇
以欧式距离作为相似度测度

 技术分享图片

技术分享图片

技术分享图片

 

 

# 创建数据

from sklearn.datasets.samples_generator import make_blobs
# make_blobs聚类数据生成器

x,y_true = make_blobs(n_samples = 300,   # 生成300条数据
                     centers = 4,        # 四类数据
                     cluster_std = 0.5,  # 方差一致,越小聚集越小,越大越分散
                     random_state = 0)
print(x[:5])
print(y_true[:5])
# n_samples → 待生成的样本的总数。
# n_features → 每个样本的特征数。
# centers → 类别数
# cluster_std → 每个类别的方差,如多类数据不同方差,可设置为[1.0,3.0](这里针对2类数据)
# random_state → 随机数种子
# x → 生成数据值, y → 生成数据对应的类别标签

plt.scatter(x[:,0],x[:,1],s = 10,alpha = 0.8)
plt.grid()
# 绘制图表

技术分享图片

from sklearn.cluster import KMeans
kmeans = KMeans(n_clusters = 4)
kmeans.fit(x)
y_kmeans = kmeans.predict(x)
centroids = kmeans.cluster_centers_
# 构建模型,并预测出样本的类别y_kmeans
# kmeans.cluster_centers_:得到不同簇的中心点

plt.scatter(x[:, 0], x[:, 1], c = y_kmeans, cmap = Dark2, s = 50, alpha = 0.5, marker = x)
plt.scatter(x[:,0],x[:,1],c = y_kmeans, cmap = Dark2, s= 50,alpha = 0.5,marker=x)
plt.scatter(centroids[:,0],centroids[:,1],c = [0,1,2,3], cmap = Dark2,s= 70,marker=o)
plt.title(K-means 300 points
)
plt.xlabel(Value1)
plt.ylabel(Value2)
plt.grid()
# 绘制图表
centroids

技术分享图片

 

以上是关于数学模型:3.非监督学习--聚类分析 和K-means聚类的主要内容,如果未能解决你的问题,请参考以下文章

备战数学建模44-聚类模型(攻坚站8)

备战数学建模44-聚类模型(攻坚站8)

数据分析及应用:11数据科学:-3监督式机器学习-4聚类

监督学习与非监督学习

K均值聚类--利用k-means算法分析NBA近四年球队实力

k-means 非监督学习聚类算法