目录
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 高斯混合模型
概率论中高斯分布的概率密度函数定义如下: