使用K-means聚类算法筛实现鸢尾花聚类
对于给定的样本集,按照样本之间的距离大小,将样本集划分为K个簇,让簇内的点尽量紧密的连在一起,而让簇间的距离尽量的大
手动实现
鸢尾花数据集描述
1、包含3种类型数据集,共150条数据 ;
2、包含4项特征:花萼长度、花萼宽度、花瓣长度、花瓣宽度
算法流程图
效果演示图
手动实现鸢尾花聚类代码
# 法一:直接手写实现
# 欧氏距离计算
def distEclud(x,y):
return npsqrt(npsum((x-y)2)) # 计算欧氏距离
# 为给定数据集构建一个包含K个随机质心centroids的集合
def randCent(dataSet,k):
m,n = dataSetshape #m=150,n=4
centroids = npzeros((k,n)) #44
for i in range(k): # 执行四次
index = int(nprandomuniform(0,m)) # 产生0到150的随机数(在数据集中随机挑一个向量做为质心的初值)
centroids[i,:] = dataSet[index,:] #把对应行的四个维度传给质心的集合
return centroids
# k均值聚类算法
def KMeans(dataSet,k):
m = npshape(dataSet)[0] #行数150
# 第一列存每个样本属于哪一簇(四个簇)
# 第二列存每个样本的到簇的中心点的误差
clusterAssment = npmat(npzeros((m,2)))# mat()创建1502的矩阵
clusterChange = True
# 1初始化质心centroids
centroids = randCent(dataSet,k)#44
while clusterChange:
# 样本所属簇不再更新时停止迭代
clusterChange = False
# 遍历所有的样本(行数150)
for i in range(m):
minDist = 1000000
minIndex = -1
# 遍历所有的质心
#2找出最近的质心
for j in range(k):
# 计算该样本到4个质心的欧式距离,找到距离最近的那个质心minIndex
distance = distEclud(centroids[j,:],dataSet[i,:])
if distance < minDist:
minDist = distance
minIndex = j
# 3更新该行样本所属的簇
if clusterAssment[i,0] != minIndex:
clusterChange = True
clusterAssment[i,:] = minIndex,minDist2
#4更新质心
for j in range(k):
# npnonzero(x)返回值不为零的元素的下标,它的返回值是一个长度为xndim(x的轴数)的元组
# 元组的每个元素都是一个整数数组,其值为非零元素的下标在对应轴上的值。
# 矩阵名A 代表将 矩阵转化为array数组类型
# 这里取矩阵clusterAssment所有行的第一列,转为一个array数组,与j(簇类标签值)比较,返回true or false
# 通过npnonzero产生一个array,其中是对应簇类所有的点的下标值(x个)
# 再用这些下标值求出dataSet数据集中的对应行,保存为pointsInCluster(x4)
pointsInCluster = dataSet[npnonzero(clusterAssment[:,0]A == j)[0]] # 获取对应簇类所有的点(x4)
centroids[j,:] = npmean(pointsInCluster,axis=0) # 求均值,产生新的质心
# axis=0,那么输出是1行4列,求的是pointsInCluster每一列的平均值,即axis是几,那就表明哪一维度被压缩成1
print("cluster complete")
return centroids,clusterAssment
def draw(data,center,assment):
length=len(center)
fig=pltfigure
data1=data[npnonzero(assment[:,0]A == 0)[0]]
data2=data[npnonzero(assment[:,0]A == 1)[0]]
data3=data[npnonzero(assment[:,0]A == 2)[0]]
# 选取前两个维度绘制原始数据的散点图
pltscatter(data1[:,0],data1[:,1],c="red",marker='o',label='label0')
pltscatter(data2[:,0],data2[:,1],c="green", marker='', label='label1')
pltscatter(data3[:,0],data3[:,1],c="blue", marker='+', label='label2')
# 绘制簇的质心点
for i in range(length):
pltannotate('center',xy=(center[i,0],center[i,1]),xytext=\
(center[i,0]+1,center[i,1]+1),arrowprops=dict(facecolor='yellow'))
# pltannotate('center',xy=(center[i,0],center[i,1]),xytext=\
# (center[i,0]+1,center[i,1]+1),arrowprops=dict(facecolor='red'))
pltshow()
# 选取后两个维度绘制原始数据的散点图
pltscatter(data1[:,2],data1[:,3],c="red",marker='o',label='label0')
pltscatter(data2[:,2],data2[:,3],c="green", marker='', label='label1')
pltscatter(data3[:,2],data3[:,3],c="blue", marker='+', label='label2')
# 绘制簇的质心点
for i in range(length):
pltannotate('center',xy=(center[i,2],center[i,3]),xytext=\
(center[i,2]+1,center[i,3]+1),arrowprops=dict(facecolor='yellow'))
pltshow()
登录后复制

调用函数查看效果
dataSet = X
k = 3
centroids,clusterAssment = KMeans(dataSet,k)
draw(dataSet,centroids,clusterAssment)
登录后复制
按不同属性划分的不同结果
基于sklearn实现鸢尾花聚类
导入相关包
import matplotlibpyplot as plt
import numpy as np
from sklearncluster import KMeans
from sklearn import datasets
登录后复制
直接从sklearndatasets中加载数据集
# 直接从sklearn中获取数据集
iris = datasetsload_iris()
X = irisdata[:, :4] # 表示我们取特征空间中的4个维度
print(Xshape)
登录后复制
绘制二维数据分布图
每个样本使用两个特征,绘制其二维数据分布图
# 取前两个维度(萼片长度、萼片宽度),绘制数据分布图
pltscatter(X[:, 0], X[:, 1], c="red", marker='o', label='see')
pltxlabel('sepal length')
pltylabel('sepal width')
pltlegend(loc=2)
pltshow()
登录后复制
实例化K-means类,并且定义训练函数
def Model(n_clusters):
estimator = KMeans(n_clusters=n_clusters)# 构造聚类器
return estimator
def train(estimator):
estimatorfit(X) # 聚类
登录后复制
训练
# 初始化实例,并开启训练拟合
estimator=Model(3)
train(estimator)
登录后复制
可视化展示
label_pred = estimatorlabels_ # 获取聚类标签
# 绘制k-means结果
x0 = X[label_pred == 0]
x1 = X[label_pred == 1]
x2 = X[label_pred == 2]
pltscatter(x0[:, 0], x0[:, 1], c="red", marker='o', label='label0')
pltscatter(x1[:, 0], x1[:, 1], c="green", marker='', label='label1')
pltscatter(x2[:, 0], x2[:, 1], c="blue", marker='+', label='label2')
pltxlabel('sepal length')
pltylabel('sepal width')
pltlegend(loc=2)
pltshow()
登录后复制

聚类
kmeans
机器学习


点赞文章给优秀博主打call~
1、K最近邻(k-NearestNeighbor,KNN)分类算法,是一个理论上比较成熟的方法,也是最简单的机器学习算法之一。该方法的思路是:如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别。
2、KNN算法中,所选择的邻居都是已经正确分类的对象。该方法在定类决策上只依据最邻近的一个或者几个样本的类别来决定待分样本所属的类别。 KNN方法虽然从原理上也依赖于极限定理,但在类别决策时,只与极少量的相邻样本有关。由于KNN方法主要靠周围有限的邻近的样本,而不是靠判别类域的方法来确定所属类别的,因此对于类域的交叉或重叠较多的待分样本集来说,KNN方法较其他方法更为适合。
3、KNN算法不仅可以用于分类,还可以用于回归。通过找出一个样本的k个最近邻居,将这些邻居的属性的平均值赋给该样本,就可以得到该样本的属性。更有用的方法是将不同距离的邻居对该样本产生的影响给予不同的权值(weight),如权值与距离成正比。
简言之,就是将未标记的案例归类为与它们最近相似的、带有标记的案例所在的类 。
原理及举例
工作原理:我们知道样本集中每一个数据与所属分类的对应关系,输入没有标签的新数据后,将新数据与训练集的数据对应特征进行比较,找出“距离”最近的k(通常k<20)数据,选择这k个数据中出现最多的分类作为新数据的分类。
算法描述
1、计算已知数据集中的点与当前点的距离
2、按距离递增次序排序
3、选取与当前数据点距离最近的K个点
4、确定前K个点所在类别出现的频率
5、返回频率最高的类别作为当前类别的预测
距离计算方法有"euclidean"(欧氏距离),”minkowski”(明科夫斯基距离), "maximum"(切比雪夫距离), "manhattan"(绝对值距离),"canberra"(兰式距离), 或 "minkowski"(马氏距离)等
Usage
knn(train, test, cl, k = 1, l = 0, prob =FALSE, useall = TRUE)
Arguments
train
matrix or data frame of training set cases
test
matrix or data frame of test set cases A vector will be interpreted as a row vector for a single case
cl
factor of true classifications of training set
k
number of neighbours considered
l
minimum vote for definite decision, otherwisedoubt (More precisely, less thank-ldissenting votes are allowed, even
ifkis increased by ties)
prob
If this is true, the proportion of the votes for the
winning class are returned as attributeprob
useall
controls handling of ties If true, all distances equal
to thekth largest are
included If false, a random selection of distances equal to thekth is chosen to use exactlykneighbours
kknn(formula = formula(train), train, test, naaction = naomit(), k = 7, distance = 2, kernel = "optimal", ykernel = NULL, scale=TRUE, contrasts = c('unordered' = "contrdummy", ordered = "contrordinal"))
参数:
formula A formula object
train Matrix or data frame of training set cases
test Matrix or data frame of test set cases
naaction A function which indicates what should happen when the data contain ’NA’s
k Number of neighbors considered
distance Parameter of Minkowski distance
kernel Kernel to use Possible choices are "rectangular" (which is standard unweighted knn), "triangular", "epanechnikov" (or beta(2,2)), "biweight" (or beta(3,3)), "triweight" (or beta(4,4)), "cos", "inv", "gaussian", "rank" and "optimal"
ykernel Window width of an y-kernel, especially for prediction of ordinal classes
scale Logical, scale variable to have equal sd
contrasts A vector containing the ’unordered’ and ’ordered’ contrasts to use
kknn的返回值如下:
fittedvalues Vector of predictions
CL Matrix of classes of the k nearest neighbors
W Matrix of weights of the k nearest neighbors
D Matrix of distances of the k nearest neighbors
C Matrix of indices of the k nearest neighbors
prob Matrix of predicted class probabilities
response Type of response variable, one of continuous, nominal or ordinal
distance Parameter of Minkowski distance
call The matched call
terms The ’terms’ object used
iris%>%ggvis(~Length,~SepalWidth,fill=~Species)
library(kknn)
data(iris)
dim(iris)
m<-(dim(iris))[1]
val<-sample(1:m,size=round(m/3),replace=FALSE,prob=rep(1/m,m))
建立训练数据集
datatrain<-iris[-val,]
建立测试数据集
datatest<-iris[val,]
调用kknn 之前首先定义公式
formula : Species ~ SepalLength + SepalWidth + PetalLength + PetalWidth
iriskknn<-kknn(Species~,iristrain,iristest,distance=1,kernel="triangular")
summary(iriskknn)
# 获取fittedvalues
fit <- fitted(iriskknn)
# 建立表格检验判类准确性
table(irisvalid$Species, fit)
# 绘画散点图,k-nearest neighbor用红色高亮显示
pcol <- ascharacter(asnumeric(irisvalid$Species))
pairs(irisvalid[1:4], pch = pcol, col = c("green3", "red")[(irisvalid$Species != fit)+1]
二、R语言knn算法
installpackages("class")
library(class)
对于新的测试样例基于距离相似度的法则,确定其K个最近的邻居,在K个邻居中少数服从多数
确定新测试样例的类别
1、获得数据
2、理解数据
对数据进行探索性分析,散点图
如上例
3、确定问题类型,分类数据分析
4、机器学习算法knn
5、数据处理,归一化数据处理
normalize <- function(x){
num <- x - min(x)
denom <- max(x) - min(x)
return(num/denom)
}
iris_norm <-asdataframe(lapply(iris[,1:4], normalize))
summary(iris_norm)
6、训练集与测试集选取
一般按照3:1的比例选取
方法一、setseed(1234)
ind <- sample(2,nrow(iris), replace=TRUE, prob=c(067, 033))
iris_train <-iris[ind==1, 1:4]
iris_test <-iris[ind==2, 1:4]
train_label <-iris[ind==1, 5]
test_label <-iris[ind==2, 5]
方法二、
ind<-sample(1:150,50)
iris_train<-iris[-ind,]
iris_test<-iris[ind,1:4]
iris_train<-iris[-ind,1:4]
train_label<-iris[-ind,5]
test_label<-iris[ind,5]
7、构建KNN模型
iris_pred<-knn(train=iris_train,test=iris_test,cl=train_label,k=3)
8、模型评价
交叉列联表法
table(test_label,iris_pred)
实例二
数据集
>
以上就是关于聚类谱系图怎么看全部的内容,包括:聚类谱系图怎么看、请高手帮忙编写关于K—mediods算法的MATLAB程序用于处理Iris数据集的聚类处理,得到迭代次数图形和准确率、地震模型去哪里下载如overtrust等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)