python 模块私有函数3 中有聚类的函数或者模块吗

来自集智百科
我们会用到sklearn这个机器学习的包,为了和这个包的最新版本配合,windows环境下pythonxy的使用者要到下载安装最新的numpy,然后到下载安装最新的sklearn。两者都是.exe文件,在windows下执行安装就可以。
我们的任务是根据萼片(sepal)的长度和宽度,以及花片(petal)的长度和宽度,一共四个特征,把不同种类的花分开来。
我们使用基于python的sklearn这个机器学习的包,其中自带Iris数据。我们要先读入这个数据
这个数据也可以在 University of California at Irvine (UCI)公开的里下载到
from matplotlib import pyplot as plt
from sklearn.datasets import load_iris
import numpy as np
试着把数据画出来
data = load_iris()
features = data['data']
feature_names = data['feature_names']
target = data['target']
for t,marker,col in zip(xrange(3),&&ox&,&rgb&):
plt.scatter(features[target == t,0], features[target == t,1], marker=marker,c=col)
plt.xlabel(feature_names[0])
plt.ylabel(feature_names[1])
使用上述命令,我们可以把数据集根据其两个特征画出来,横轴是萼片(sepal)的长度,纵轴是萼片(sepal)的宽度,如下图所示
三角形代表Setosa,圆形代表Versicolor,叉叉代表Virginica。
我们当然也可以写一个函数来画图,把四个特征的所有组合都画出来看一下数据在特征空间的分布,一共有六个二维投影
def plotIrisData(x,y):
for t,marker,col in zip(xrange(3),&&ox&,&rgb&):
plt.scatter(features[target == t,x], features[target == t,y], marker=marker,c=col)
plt.xlabel(feature_names[x])
plt.ylabel(feature_names[y])
figure(num=None, figsize=(12, 8), dpi=80, facecolor='w', edgecolor='k')
plt.subplot(231)
plotIrisData(0,1)
plt.subplot(232)
plotIrisData(0,2)
plt.subplot(233)
plotIrisData(0,3)
plt.subplot(234)
plotIrisData(1,2)
plt.subplot(235)
plotIrisData(1,3)
plt.subplot(236)
plotIrisData(2,3)
plt.tight_layout(pad=0.4, w_pad=0, h_pad=1.0)
我们观察发现,仅仅是根据花片的长度&2这个指标,已经足以把Setosa(三角形)与其他两种花分别来开。那么,剩下两种花如何区分呢?
假设我们只想根据一个特征来区分,我们可以写一个非常粗暴的算法,把所有可能的特征及相应的所有可能的阈值遍历一边,找出最合适的特征及相应的阈值
combineData=np.concatenate((features,array([target]).T), axis=1)
newfeatures=combineData[combineData[:,4] != 0,]
def thresholdFunction(t, feature_name):
AccuracyN=0
r=feature_names.index(feature_name)
for i in newfeatures:
if i[r]&t and i[4]==1:
AccuracyN+=1
if i[r]&=t and i[4]==2:
AccuracyN+=1
AccuracyRate=AccuracyN/len(newfeatures)
return AccuracyRate
final_feature_name=&&
final_accuracy_rate=0
final_thresold=0
for name in feature_names:
featuredata=newfeatures[:,feature_names.index(name)]
for threshold in featuredata:
AR = thresholdFunction(threshold, name)
if AR & final_accuracy_rate:
final_accuracy_rate = AR
final_feature_name = name
final_thresold=threshold
print final_feature_name +& & + str(final_thresold) +& & + str(final_accuracy_rate)
发现,划分的精度(Accuracy)最高的是petal width这个特征,取阈值在1.8时,划分Versicolor(圆形)和Virginica(叉叉)的精度可以达到94%。
plotIrisData(2,3)
plot([0,8],[final_thresold,final_thresold],color=&red&,linestyle=&--&)
text(-0.5,2,&Threthold = &+str(final_thresold) + &; & + &Accuracy rate = &
+str(final_accuracy_rate))
使用上述命令,我们可以把我们找到的阈值画出来看看效果。
需要注意的是,我们这里不仅划分的方法十分暴力,检查的方法也十分暴力。实际上,我们使用了所有的数据做训练集来得到一个最优阈值,而根本没留出尚未被用于训练的数据对阈值做检查。所以我们应该划分出训练集和测试集,前者用于训练模型,后者用于检查模型。而且,真正“科学”的做法是Cross-validation,这种检查有助于避免我们的模型在训练集数据的作用下过度拟合(over-fit)。我们在这里不具体给出代码和结果,但需要介绍一下Cross-validation的基本框架:
即每次随机地抽一部分数据做训练集,另外一部分做测试集,多次重复这个过程。图中训练集和测试集的关系是4:1,实际中常常用到的另一个标准是9:1.
小麦的数据可以在 University of California at Irvine (UCI)公开的里下载到。
使用以下代码来处理数据
data = []
f = open('E:/wulingfei/seeds_dataset.txt','rb')
for i in f.readlines():
i=i.strip().split(&\t&)
if len(i)==8:
data.append(i)
f.close()
data=array(data).astype(float)
我们的任务是,识别三种不同的小麦,Kama, Rosa 和 Canadian。我们手头上有七个变量:
1. area A,
2. perimeter P,
3. compactness C = 4*pi*A/P^2,
4. length of kernel,
5. width of kernel,
6. asymmetry coefficient
7. length of kernel groove.
(All of these parameters were real-valued continuous.)
与iris的案例不同,这次我们很难根据单一简单的特征寻找阈值来划分数据了,划分的标准可能会牵涉到一个或多个指标。我们采取一个非常简单的思路:特征空间里的最近邻算法。
首先我们定义欧式距离公式
def distance(p0, p1):
return np.sum( (p0-p1)**2)
其次,使用这个距离定义,我们就可以对任意新的记录进行判别了:
def nn_classify(training_set, training_labels, new_example):
dists = np.array([distance(t, new_example) for t in training_set])
nearest = dists.argmin()
return training_labels[nearest]
使用函数:
train1=data[0][:-1]
test1=data[-1][:-1]
distance(train1, test1)
我们可以把其中两个维度的数据画出来:
for t,marker,col in zip(xrange(1,4),&o^D&,&rgb&):
plt.scatter(data[data[:,-1] == t,0], data[data[:,-1] == t,2], marker=marker,c=col)
plt.xlabel(&compactness&)
plt.ylabel(&area&)
那么,我们刚才的最近邻法则,在这个二维特征空间里,实际上切分出了什么样的领域呢?我们可以通过以下算法把领域画出来:
dx, dy = 0.05, 0.05
Y, X = np.mgrid[slice(0.75, 0.94 + dy, dy),
slice(10, 22 + dx, dx)]
def Zfunction(X,Y):
nX=X.reshape([X.shape[0]*X.shape[1],1])
nY=Y.reshape([Y.shape[0]*Y.shape[1],1])
nXY=np.concatenate((nX,nY), axis=1)
nZ=[]
for i in nXY:
z =nn_classify(array(zip(data[:,0],data[:,2])), training_labels, i)
nZ.append(z)
return array(nZ).reshape(X.shape)
Z=Zfunction(X,Y)
plt.contourf(X + dx , Y + dy , Z,cmap = plt.cm.bone,origin='lower')
for t,marker,col in zip(xrange(1,4),&o^D&,&rgb&):
plt.scatter(data[data[:,-1] == t,0], data[data[:,-1] == t,2], marker=marker,c=col)
plt.xlabel(&compactness&)
plt.ylabel(&area&)
为什么这个领域划分看起来这么奇怪呢?因为xy轴上的权重不一样。x轴上的变化主导了二维欧式距离。为了解决这个问题,我们需要对xy进行标准化,也就是转化为Z-score。“The Z-score of a value is how far away from the mean it is in terms of units of standard deviation.”。
data[:,0]=(data[:,0]-mean(data[:,0]))/std(data[:,0])
data[:,2]=(data[:,2]-mean(data[:,2]))/std(data[:,2])
dx, dy = 0.1, 0.1
Y, X = np.mgrid[slice(-3, 3 + dy, dy),
slice(-3, 3 + dx, dx)]
Z=Zfunction(X,Y)
plt.contourf(X + dx , Y + dy , Z,cmap = plt.cm.bone,origin='lower')
for t,marker,col in zip(xrange(1,4),&o^D&,&rgb&):
plt.scatter(data[data[:,-1] == t,0], data[data[:,-1] == t,2], marker=marker,c=col)
plt.xlabel(&compactness&)
plt.ylabel(&area&)
从上述两个例子中我们发现,一个Classification model其实有三个部分:
The structure of the model: 在iris的例子中,我们使用的是单一特征的单一阈值,在小麦的例子中,是好几个混合的特征取的各自阈值构成的边界。
The search procedure: 在iris的例子中,我们暴力搜索了所有空间的所有阈值,在小麦的例子中,我们没有搜索整个特征空间,我们使用训练集中的最接近的邻居的标签来判别。
The loss function:在iris的例子中,是1-Accuracy,在小麦的例子中,我们没有特别定义这个函数。
That's the best answer by far! Thanks for conbnitutirg.sohocoder收集全网最新、最全项目
Python自然语言处理(三) -- 利用NLTK进行聚类
这篇文章介绍如何利用NLTK进行聚类,和上两篇文章、不同,聚类不能算作自然语言处理的内容,但可以很容易应用到NLP中,因此将其划分到自然语言处理下。-------------------进入正题--------------------nltk内部封装了常用的聚类方法:Kmeans(K均值)、混合高斯聚类以及GAAC(组平均层次聚类)使用这些聚类方法之前,需要保证已安装pynum,因为他们聚类传入的数据要求是pynum.array类型。pynum的安装教程网上一大堆,这里不进行介绍。一、数据准备下面所有的聚类数据都是用这组:注意:datas的元素是array类型二、Kmeans聚类用到的函数:nltk.cluster.kmeans.KMeansClusterer(num_means, distance )#返回Kmeans聚类器的对象,num_means:目标类别数,distance:自定义距离函数例子中,我们的目标类别数目为2, 距离函数为欧式距离km.cluster(datas) #对数据集datas进行聚类km.classify(data)#返回data被分到的类别三、GAAC聚类nltk.cluster.gaac.GAAClusterer(num_clusters , normalise )#num_clusters:目标类别数, normalise:是否归一化这里需要说明一下,GAAC的距离使用的是点积的结果,并不是余弦相似度,如果normalise设置为True,将相似度进行归一化,此时的距离为余弦相似度GAAC无法自定义相似度例子中,我们设置目标类别为3,距离需要归一化,也即相似度为余弦相似度。上述结果可以看出,所分的三个类为{(1,0)}, {(0,1)}, {[ 1, &1.] [ 5, &5.] [ 5 , 4.] [ 4 , 5.]}结果和Kmeans非常不同,这是因为使用的相似度为余弦相似度四、混合高斯聚类用到的函数:nltk.cluster.em.EMClusterer(initial_means)#initial_means:the means of the gaussian cluster centers箭头表示聚类的结果,其余数据为中间数据。
阅读: 3967 |您所在位置: &
&nbsp&&nbsp&nbsp&&nbsp
基于Python的聚类分析和其应用.pdf5页
本文档一共被下载:
次 ,您可全文免费在线阅读后下载本文档。
文档加载中...广告还剩秒
需要金币:100 &&
你可能关注的文档:
··········
··········
第24卷第1期 上海工程技术大学学报 V01.24NO.1 2010年3月 JOURNALSHANGHAI 0FEN6INEERINGSCIENCE Mar.2010 OF UNIVERSITY 文章编号:X 47―04 基于Python的聚类分析及其应用 庄怡雯,吴金桥,黄润才,曹奇英 东华大学计算机科学与技术学院,上海201620 摘要:在研究聚类基本原理及相应算法的基础上,着重分析了层次聚类算法和k―means分割聚 类算法,并比较了这两种算法的特点.结合Python语言的特点,编写程序实现了k-means聚类算 法在博客数据集上的聚类应用,给出了详细的聚类实验结果分析. 关键词:聚类分析;Python语言;层次聚类;k-means聚类 39 中图分类号:TP 文献标志码:A Cluster
andIts Python。BasedAnalysis Application ZHUANG Yi―wen,WU Run-cai,CAO Jin―qiao,HUANG Qi―ying of
Scienceand 201620,China CollegeComputer
Technology。DonghuaUniversity,Shanghai ontheresearchofthe
and ofcluster ofthehi―
Abstract:Based principlealgorithmsanalysis,theanalysis
erarchcalcluster
andk―means cluster
were oftwo algorithm partitionalalgorithm were of was
algorithmscompared.CombinationPythonlanguage,k―meansclusteringalgorithmimple―
dataset,andadetailed of resultwas blog analysisexperimentalclustering given. words:cluster clustering;k-means
Key analysis;Pythonlanguage;hierarchical clustering 聚类作为数据挖掘中的一项重要技术,常被用 在相似性划分为多个类别,使类别内的数据相似度
于大数据量的信息挖掘,如零售商可以利用聚类算 较大,而类别间的数据相似度较小.通常,聚类算法
法跟踪消费者的购买行为,并据此策划相应的市场 所需的数据预处理是定义一组公共的数值型属性,
策略.聚类属于无监督学习方法,无监督学习算法 然后,利用这些属性对数据项进行比较.
正在加载中,请稍后...}

我要回帖

更多关于 python 模块 函数 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信