前言:发现好多都离不开机器学习,那就先学上一丢丢,小羊冲呀
今日份之——聚类学习
一、
1、机器学习分类:
监督学习
无监督学习
强化学习
半监督学习
深度学习
Scikit-learn
主要学习:分类 聚类 回归 降维 模型选择 数据的预处理
2、sklearn库安装
numpy scipy matplotlib sklearn
3、标准数据集及其功能
波士顿房价数据集
二、无监督学习
利用无标签的数据学习数据的分布或数据与数据之间的关系被称作无监督学习
常用的场景是聚类和降维
聚类:
聚类,就是根据数据的“相似性”将数据分为多类的过程。
评估两个不同样本之间的“相似性”,通常使用的方法就是计算两个样本之间的距离。
使用不同的方法计算样本间的距离会关系到聚类结果的好坏。
1、欧式距离
2、曼哈顿距离
3、马氏距离
马氏距离(Mahalanobis Distance)是度量学习中一种常用的距离指标,同欧氏距离、曼哈顿距离、汉明距离等一样被用作评定数据之间的相似度指标。但却可以应对高维线性分布的数据中各维度间非独立同分布的问题。
马氏距离-Mahalanobis Distance_Saul Zhang的博客-CSDN博客_马氏距离
夹角余弦
余弦值越接近1,说明两个向量夹角余越接近0度,表明两个向量越相似
三、K-means方法及其应用
四、DBSCAN算法
将数据点分为三类:
核心点、边界点、噪音点
代码:
import numpy as np
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt
def loadData(filePath):
fr=open(filePath,'r+')
lines=fr.readlines()
retData=[]
retCityName=[]
for line in lines:
items=line.strip().split(',')
retCityName.append(items[0])
retData.append([float(items[i]) for i in range(1,len(items))])
return retData,retCityName
if __name__=='__main__':
data,cityName=loadData('E://city.txt')#加载的数据
km=KMeans(n_clusters=3)#分成3簇
label=km.fit_predict(data)#label聚类后各数据所属的标签,fit_predict;计算簇中心以及为簇分配序号
expenses=np.sum(km.cluster_centers_,axis=1)
print(expenses)
CityCluster=[[],[],[]]
for i in range(len(cityName)):
CityCluster[label[i]].append(cityName[i])
for i in range(len(CityCluster)):
print("Expenses:%.2f"%expenses[i])
print(CityCluster[i])
plt.hist(data)
plt.show()
import numpy as np
import sklearn.cluster as skc
from sklearn import metrics
import matplotlib.pyplot as plt
mac2id = dict()
onlinetimes = []
f = open('E://TestData.txt', encoding='utf-8')
for line in f:
mac = line.split(',')[2]
onlinetime = int(line.split(',')[6])
starttime = int(line.split(',')[4].split(' ')[1].split(':')[0])
if mac not in mac2id:
mac2id[mac] = len(onlinetimes)
onlinetimes.append((starttime, onlinetime))
else:
onlinetimes[mac2id[mac]] = [(starttime, onlinetime)]
real_X = np.array(onlinetimes).reshape((-1, 2))#转换成2列
X=real_X[:,1:]
X=np.log(1+real_X[:,1:])#进行以10为底的对数运算,加1是怕出现负数
print(real_X[:,1:])
db = skc.DBSCAN(eps=0.14, min_samples=10).fit(X)
labels = db.labels_
raito = len(labels[labels[:] == -1]) / len(labels)
print('Noise raito:', format(raito, '.2%'))
n_clusters_ = len(set(labels)) - (1 if -1 in labels else 0)
print('Estimated number of clusters: %d' % n_clusters_)
print("Silhouette Coefficient: %0.3f" % metrics.silhouette_score(X, labels))
for i in range(n_clusters_):
print('Cluster ', i, ':')
count=len(X[labels==i])
mean=np.mean(real_X[labels==i][:,1])#平均值
std=np.std(real_X[labels==i][:,1])#标准差
print(list(X[labels == i].flatten()))
print('个数:'+str(count)+' 均值:'+str(mean)+'方差:'+str(std))