机器学习(4)——无监督学习

本文深入探讨无监督学习中的k-均值聚类算法及其在新型传染病聚类分析中的应用。通过实例展示了k-均值聚类的效果,并讨论了模型保存的方法。此外,还介绍了高斯混合模型和层次聚类。
摘要由CSDN通过智能技术生成

目录

1无监督学习

1.1 k-均值聚类算法

1.2 新型传染病聚类分析

1.3 机器学习模型保存

1.4 高斯混合模型

1.5 层次聚类

2 分类模型泛化

2.1 数据划分有效性

2.2 更有效数据划分

2.2.1 交叉验证分离器

2.2.2 打乱交叉验证

2.3 模型参数优化

2.3.1 网络搜索

2.3.2 交叉验证网络搜索

2.3.3 管道使用

2.4 主成分分析

2.5 流形学习


1无监督学习

1.1 k-均值聚类算法

无监督学习是指事先并不知道实际的输出和分类结果,要做的就是从一堆数据中心尝试找到新的知识。最基本的算法有k-均值聚类算法(k-means clustering algorithm)。k-均值聚类思路是将每个数据点分配给最近的簇中心,然后将每个簇中心设置为所分配的所有数据点的平均值,当簇的分配不再变化时,算法则结束。

k-均值聚类算法具体可以描述如下:

(1)任意选择k个点,作为初始的聚类中心。

(2)遍历每个对象,分别对每个对象求与k个中心点的距离,把对象划分到与最近的中心所代表的类别中去。

(3)对于每一个中心点,遍历他们所包含的对象,计算这些对象所有维度的和的中值,获得新的中心点。

(4)计算当前状态下的损失,如果当前损失比上一次迭代的损失相差大于某一值(如1),则继续执行第(2)、(3)步,直到连续两次的损失差为某一设定值为止(达到最优,通常设置为1)。

聚类是将数据划分为组,这些组称为簇。聚类的目的就是从数据中发现可能的新的规律。

单相接地故障k-均值聚类算法实例:

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
from sklearn.model_selection import train_test_split
from matplotlib.colors import ListedColormap
from sklearn.cluster import KMeans
df1 = pd.read_csv('E:\PYTHON\ground_feature0.csv') #读取特征向量
data = df1.values
X = data[:,0:2] #构建要分割的数据,前两列
y = data[:,2] #构建分类目标
#分割数据集
X_train,X_test,y_train,y_test = train_test_split(X,y,random_state=10)
def plot_decision_regions(X,y,classifier,test_idx=None,resolution=0.02):#两类分类曲线绘图函数定义
    #setup marker generator and color map
    markers = ('s','x','o','^','v')
    colors = ('red','blue','lightgreen','gray','cyan')
    cmap = ListedColormap(colors[:len(np.unique(y))])
    #plot the decision surface
    x1_min,x1_max = X[:,0].min()-1,X[:,0].max()+1
    x2_min,x2_max = X[:,1].min()-1,X[:,1].max()+1
    xx1,xx2 = np.meshgrid(np.arange(x1_min,x1_max,resolution),np.arange(x2_min,x2_max,resolution))
    Z = classifier.predict(np.array([xx1.ravel(),xx2.ravel()]).T)
    Z = Z.reshape(xx1.shape)
    plt.contourf(xx1,xx2,Z,alpha=0.4,cmap=cmap)
    plt.xlim(xx1.min(),xx1.max())
    plt.ylim(xx2.min(),xx2.max())
    #plot all sample
    X_test,y_test = X[test_idx,:],y[test_idx]
    for idx,cl in enumerate(np.unique(y)):
        plt.scatter(x=X[y==cl,0],y=X[y==cl,1],alpha=0.8,c=cmap(idx),marker=markers[idx],label=cl)
gf_kmeans = KMeans(n_clusters=2)
gf_kmeans.fit(X_train)
plot_decision_regions(X,y,classifier=gf_kmeans,test_idx=range(16,22))
plt.xlabel("Drop percentage KMeans")
plt.ylabel("Ascending mutation value")
plt.legend(loc='upper right')
plt.title('One-phase ground')
plt.show()
gf_new = np.array([[0.590,1.9]])
print('KMeans Training set scores: {:.2f}'.format(gf_kmeans.score(X_train, y_train)))
print('KMeans Test set scores: {:.2f}'.format(gf_kmeans.score(X_test, y_test)))
print('KMeans New array Prediction: {}'.format(gf_kmeans.predict(gf_new)))

运行结果如下:

KMeans Training set scores: -68.07
KMeans Test set scores: -14.40
KMeans New array Prediction: [1]

k-均值聚类分类曲线

这种聚类分类曲线,在解决单相接地故障分类上效果并不好。

1.2 新型传染病聚类分析

判断一种新型病是否能构成新的传染病类型,其实可以根据医学经验构建出该病前期阶段病例特征向量,一种可能的特征向量构造如下:

[同一地方,体温,肺CT,三天治疗效果,七天治疗效果,14天增加人数比例,病理相似性,异常级别]

该向量由8个分量组成,各自的含义如下:

同一地方:表示病人是否到过同一区域。1~0的数据,1到过核心地带,0没有。中间数据表示接近核心地带的边缘强度,如0.7表示病人接近核心地带的边缘。

体温:表示人的体温是否正常。1~0的数据,1代表高烧,0代表正常。中间数据表示低烧。

肺CT:表示病人肺部病理类似度。1~0的数据,1代表完全相似,0代表不相似。中间数据表示相似大小。

三天治疗效果:1~0的数据,1代表恶化,0代表治愈。中间数据代表病情的轻重分级。

七天治疗效果:1~0的数据,1代表恶化,0代表治愈。中间数据代表病情的轻重分级。

14天增加人数比例:按净增加人数除以总人数计算,总人数为历史人数+净增人数,将此数据限制在1~0。

病理相似性:1~0的数据,表示病理之间是否有相似性,1代表完全相似,0代表不相似。中间数据表示相似程度。

异常级别:表示医生认为此病比传统疾病异常与否。1~0的数据,1代表异常最大,0代表不异常。中间数据代表异常强度。

模拟数据desease_1.csv文件:

desease_1.csv文件获取

链接:https://pan.baidu.com/s/1rtNYuTNjmZjmEWK5fTczdw 
提取码:whj6

下面对一种传染病前期病情k-均值聚类分析,机器识别程序如下:

import pandas as pd
from sklearn.cluster import KMeans
da = pd.read_csv('E:\PYTHON\desease_1.csv')
data1 = da.values
estimator = KMeans(n_clusters=2) #n_clusters为簇的个数,分类数目
estimator.fit(data1)
label_pred = estimator.labels_
print(label_pred)

运行结果如下:

[1 0 1 1 0 1 1 0 0]

由运行结果可以看出,通过两类聚类划分,第一、三、四、六、七条数据划分为了一类,说明这些数据有共同特点,具有新型传染病共同特征。

1.3 机器学习模型保存

分类模型参数保存后,下次使用时调用即可。保存Python分类模型需要用到joblib包。

例如,将上述分类模型保存到desease_cluster.pkl文件中。

import pandas as pd
from sklearn.cluster import KMeans
import joblib
da = pd.read_csv('E:\PYTHON\desease_1.csv')
data1 = da.values
estimator = KMeans(n_clusters=2) #n_clusters为簇的个数,分类数目
estimator.fit(data1)
label_pred = estimator.labels_
#print(label_pred)
joblib.dump(estimator,'desease_cluster.pkl') #将estimator模型保存到desease_cluster.pkl中
des = joblib.load('desease_cluster.pkl') #读取模型分类数据
print(des.labels_) #显示分类目标

运行结果如下:

[0 1 0 0 1 0 0 1 1]

当通过聚类分析构建出新的分类模型后,就可以对新病例分类预测。

import pandas as pd
from sklearn.cluster import KMeans
import joblib
da = pd.read_csv('E:\PYTHON\desease_1.csv')
data1 = da.values
estimator = KMeans(n_clusters=2) #n_clusters为簇的个数,分类数目
estimator.fit(data1)
label_pred = estimator.labels_
#print(label_pred)
joblib.dump(estimator,'desease_cluster.pkl') #将estimator模型保存到desease_cluster.pkl中
des = joblib.load('desease_cluster.pkl') #读取模型分类数据
#print(des.labels_) #显示分类目标

x = [1,1,1,1,1,1,1,1] #新病例向量
zz = [x]
print(des.predict(zz)) #新病例预测归类

运行结果如下:

[0]

由运行结果可知,使用dump()函数将分类模型保存在当前目录下的desease_cluster.pkl文件中。使用load()函数将模型参数读出赋值给des,通过类标和预测函数就可以进行相关操作和新向量的识别,这样就不需要重新训练分类器了。

1.4 高斯混合模型

概率论中高斯分布的概率密度函数定义如下:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值