无监督学习PCA降维处理和K-means聚类

Orianna ·
更新时间:2024-09-21
· 788 次阅读

1、无监督学习

没有目标值(变量)的算法

常见的无监督学习算法:

降维:

– 主成分分析PCA降维处理

聚类:

– K-means(k均值聚类)

2、主成分分析

应用PCA实现特征的降维

·定义:高维数据转化为低维数据的过程,在此过程中可能会舍弃原有数据、创造新的变量

·作用:是数据维散压缩,尽可能降低原数据的维数(复杂度),损失少量信息。

·应用:回归分析或者聚类分析当中

PCA的APA:

·sklearn.decomposition.PCA(n_components=None)
- 将数据分解为较低维数空间

n_components:
·小数:表示保留百分之多少的信息
·整数:减少到多少特征变量 PCA.fit_transform(X) X:numpy array格式的数据[n_samples,n_features] 返回值:转换后指定维度的array '''#构造一组特征值数据''' import numpy as np import pandas as dp from scipy import stats np.random.seed(10) # 先生成一个种子生成器,以后生成的随机数就是一样的,参数为任意数字 x1 = stats.norm.rvs(loc=5,scale=0.0,size=500) #均值为5,标准差为0.0的正态分布,随机随机生成500个样本 x2 = stats.t.rvs(10, size=500) #生成服从t分布,自由度为10的500个随机数(rvs生成随机数) x3 = stats.norm.rvs(loc=1,scale=0.5,size=500) #均值为1,标准差为0.5的正态分布,随机随机生成500个样本 x4 = np.random.rand(500) x5 = 10*x4+5 + stats.norm.rvs(loc=0,scale=0.0,size=500) #stats.norm.rvs(loc=0,scale=0.0,size=500)用来构造残差 x6 = -5*x2 +1 + stats.norm.rvs(loc=0,scale=0.0,size=500) #暂时不构造目标值y data = pd.DataFrame({"x1":x1,"x2":x2,"x3":x3,"x4":x4,"x5":x5,"x6":x6}) display(data.sample(5)) '''# 主成分分析,保留n.n% 的信息''' from sklearn.decomposition import PCA import pandas as pd import numpy as np #2.实例化一个转换器类 transfer = PCA(n_components=0.9) #实例化一个转换器类 # n_components: ·小数:表示保留百分之多少的信息 ·整数:减少到多少特征 #3.#调用fit_transform() xi = transfer.fit_transform(data) #调用fit_transform() print(xi.shape,transfer.explained_variance_ratio_) #查看构成新的几个变量,查看单个变量的方差贡献率 #4.输出新构造出来的主成分变量 Fi=[ ] for i in range(1,xi.shape[1]+1): F="F" + str(i) Fi.append(F) data02 = pd.DataFrame(xi,columns=Fi) display(data02.head(3))
x1 x2 x3 x4 x5 x6
210 5.0 -0.542916 1.016115 0.165684 6.656838 3.714578
332 5.0 -1.302843 1.063437 0.424865 9.248654 7.514214
326 5.0 -0.511865 1.483560 0.395558 8.955583 3.559323
485 5.0 -0.110560 0.827054 0.168215 6.682154 1.552801
324 5.0 0.356415 0.959323 0.698024 11.980240 -0.782075
(500, 2) [0.76618774 0.22716614]
F1 F2
0 6.144052 -4.055635
1 -4.243350 4.787573
2 1.427541 -1.995314
3、K-means(k均值聚类)

·1、K值的选择【1.可根据业务需求,看需要分多少(n)个组就取n;没有明确要求的时候可以进行网格搜索调节超参数,选择最合适的k值】

·2、随机设置K个特征空间内的点作为初始的聚类中心

·3、对于其他每个点计算到K个中心的距离,未知的点选择最近的一个聚类中心点作为标记类别

·4、接着对着标记的聚类中心之后,重新计算出每个聚类的新中心点(平均值)

·5、如果计算得出的新中心点与原中心点一样,那么结束,否则重新进行第二步过程

K-means的APl:

·sklearn.cluster.KMeans(n_clusters=3,init=‘k-means++’) # K-means聚类

。n_clusters:开始的聚类中心数量k值 。init:初始化方法,默认为'k-means++'

.labels_:用来查看默认标记的类型,可以和真实值比较(不是值比较)

K-means性能评估指标

1、轮廓系数

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rXcJDQkm-1582713296549)(attachment:image.png)]

2、轮廓系数API

·sklearn.metrics.silhouette_score(X,labels)

。计算所有样本的平均轮廓系数 。X:特征值变量 。labels:被聚类标记的目标值 K-means特点总结

·特点分析:采用迭代式算法,直观易懂并且非常实用

·缺点:容易收敛到局部最优解(多次聚类)

·注意:聚类一般做在分类之前,当做出符合业务场景的聚类后,以后的新的数据,就是做分类处理

# 1 数据,我们使用上一段代码x1-x6降维处理后的数据 # display(data02.shape,data02.head(3)) # 2 预估器流程 from sklearn.cluster import KMeans # estimator = KMeans(n_clusters=3,init='k-means++') #实例化预估器 #引入超参数搜索-网格搜索(Grid Search),模型调优 from sklearn.model_selection import GridSearchCV #网格搜索和交叉验证 estimator = KMeans(init='k-means++') #准备参数 param_dict = {"n_clusters":[2,3,4,5,6]} #k值设定的可能取值 estimator = GridSearchCV(estimator,param_grid=param_dict,cv=10) #cv=10是10折交叉验证 estimator.fit(data02) #训练模型 # 3、查看网格搜索和交叉验证返回结果 # 最佳参数:best_params_ print("最佳参数k:",estimator.best_params_) # 最佳估计器:best_estimator_ print("最佳估计器",estimator.best_estimator_) #注意best_estimator_的输出解释:metric='minkowski'是名可夫斯基距离,当p=1时是使用曼哈顿距离,当p=2时是使用欧式距离 # 交叉验证结果:cv_results_ #print(estimator.cv_results_) #比较长这里就不输出了 #estimator.best_estimator_ 表示模型调优后的最佳预估器,如果没有模型调优,后边的预估器直接用estimator # 4 K-means性能评估 from sklearn.metrics import silhouette_score #轮廓系数 labels = estimator.best_estimator_.labels_ Sc = silhouette_score(data02,labels) print("轮廓系数Sc(取值为-1到1,越接近1性能越好):",Sc) #输出分组 y_predict = estimator.best_estimator_.labels_ #输出训练集的分组 # y_predict = estimator.best_estimator_.predict(data02) #输出训练集的分组 和.labels_一样 #构建成二维表查看 import pandas as pd data02['y'] = y_predict display(data02.head())

最佳参数k: {‘n_clusters’: 6}
最佳估计器 KMeans(algorithm=‘auto’, copy_x=True, init=‘k-means++’, max_iter=300,
n_clusters=6, n_init=10, n_jobs=1, precompute_distances=‘auto’,
random_state=None, tol=0.0001, verbose=0)
轮廓系数Sc(取值为-1到1,越接近1性能越好): 0.36306500401647485

F1 F2 y
0 6.144052 -4.055635 3
1 -4.243350 4.787573 2
2 1.427541 -1.995314 3
3 7.118382 0.289722 0
4 -3.988264 -3.068422 5

作者:Jalen data analysis



pca k-means

需要 登录 后方可回复, 如果你还没有账号请 注册新账号
相关文章