1. ---
    layout: post
    title: 2018-02-03-PY3下经典数据集iris的机器学习算法举例-零基础
    key: 20180203
    tags: 机器学习 ML IRIS python3
    modify_date: 2018-02-03
    ---
  2.  
  3. # python3下经典数据集iris的机器学习算法举例-零基础
    说明:
    * 本文发布于: gitee,github,博客园
    * 转载和引用请指明原作者和连接及出处.
  4.  
  5. 正文:
    * 以下内容可以拷贝到一个python3源码文件,比如较“iris_ml.py”当中,运行即可;
  1. ###########################
  2. #说明:
  3. # 撰写本文的原因是,笔者在研究博文“http://python.jobbole.com/83563/”中发现
  4. # 原内容有少量笔误,并且对入门学友缺少一些信息。于是笔者做了增补,主要有:
  5. # .查询并简述了涉及的大部分算法;
  6. # .添加了连接或资源供进一步查询;
  7. # .增加了一些lib库的基本操作及说明;
  8. # .增加了必须必要的python的部分语法说明;
  9. # .增加了对模型算法,数据挖掘等领域的思考和判断;
  10. # .修订了原作者代码上的笔误,跑通全部程序,拷贝就可用!
  11. # .其他
  12. # 目标是:针对python是0基础!但喜欢数据挖掘的初级学友,方面其入门,减少挫折感!
  13. # 通过“一份带注释的可用代码”来学习!
  14. #建议:先学习,或初步浏览原作者的博文(如上)。
  15. #链接:笔者资源收集贴“http://www.cnblogs.com/taichu/p/5216659.html”,供新老学友参考,笔者会不断整理更新!
  16. ###########################
  17.  
  18. ###########################
  19. #()心得
  20. # .因为数据的找寻,分析和建模一条龙代价不菲。
  21. # 应该‘榨干’一份数据和模型的每种可能性,彻底研究掌握。
  22. # 往往能一通百通,一个模型反复折腾能用到各种方法和体会!
  23. ###########################
  24.  
  25. ###########################
  26. #()观察原始数据(样本)
  27. #知识点:数据导入;数据可视化
  28. ###########################
  29.  
  30. ##################
  31. #在ubuntu15.10中通过如下6条命令来安装python环境
  32. #sudo apt-get install python #安装python最新版,一般已经自带最新2.7版本了
  33. #sudo apt-get install python-numpy #安装python的numpy模块
  34. #sudo apt-get install python-matplotlib
  35. #sudo apt-get install python-networkx
  36. #sudo apt-get install python-sklearn
  37. #python #看python版本并进入交互式界面,就可以执行如下命令,全部拷贝黏贴进去试试看?
  38. #另外,可以下载Anaconda的Python IDE集成环境,搜一下非常好,很多SCIPY等核心库都集成了,免去安装之苦!
  39. #特别注意:笔者是WIN10宿主机上安装Ubuntu15.10最新虚拟机,在Ubuntu中默认安装了python,升级并安装以上lib后实践所有如下代码!
  40. ##################
  41.  
  42. from urllib import request
  43. url = 'http://aima.cs.berkeley.edu/data/iris.csv'
  44. response = request.urlopen(url)
  45. #以下为本地样本存储路径,请根据实际情况设定!
  46. #localfn='/mnt/hgfs/sharedfolder/iris.csv' #for linux
  47. #localfn='C:\\TEMP\\iris.csv' #for windows
  48. localfn='iris.csv' #for windows
  49. localf = open(localfn, 'w')
  50. localf.write(response.read().decode('utf-8'))
  51. localf.close()
  52.  
  53. # data examples
  54. #COL1, COL2, COL3, COL4, COL5
  55. #5.1 3.5 1.4 0.2 setosa
  56. #… … … … …
  57. #4.7 3.2 1.3 0.2 setosa
  58. # 3.2 4.7 1.4 versicolor
  59. #… … … … …
  60. #6.9 3.1 4.9 1.5 versicolor
  61. #6.3 3.3 2.5 virginica
  62. #… … … … …
  63. #7.1 5.9 2.1 virginica
  64.  
  65. #############################
  66. #U can get description of 'iris.csv'
  67. #at 'http://aima.cs.berkeley.edu/data/iris.txt'
  68. #Definiation of COLs:
  69. #. sepal length in cm (花萼长)
  70. #. sepal width in cm(花萼宽)
  71. #. petal length in cm (花瓣长)
  72. #. petal width in cm(花瓣宽)
  73. #. class:
  74. # -- Iris Setosa
  75. # -- Iris Versicolour
  76. # -- Iris Virginica
  77. #Missing Attribute Values: None
  78. #################################
  79.  
  80. from numpy import genfromtxt, zeros
  81. # read the first columns
  82. data = genfromtxt(localfn,delimiter=',',usecols=(,,,))
  83. # read the fifth column
  84. target = genfromtxt(localfn,delimiter=',',usecols=(),dtype=str)
  85.  
  86. print (data.shape)
  87. # output: (, )
  88. print (target.shape)
  89. # output: (,)
  90.  
  91. #auto build a collection of unique elements
  92. print (set(target))
  93. # output: set(['setosa', 'versicolor', 'virginica'])
  94. #print set(data) #wrong usage of set, numbers is unhashable
  95.  
  96. ######################
  97. #plot库用法简述:
  98. #'bo'=blue+circle; 'r+'=red+plus;'g'=red+*
  99. #search keyword 'matlab plot' on web for details
  100. #http://www.360doc.com/content/15/0113/23/16740871_440559122.shtml
  101. #http://zhidao.baidu.com/link?url=6JA9-A-UT3kmslX1Ba5uTY1718Xh-OgebUJVuOs3bdzfnt4jz4XXQdAmvb7R5JYMHyRbBU0MYr-OtXPyKxnxXsPPkm9u5qAciwxIVACR8k7
  102. ######################
  103.  
  104. #figure for 2D data
  105. from pylab import plot, show
  106. plot(data[target=='setosa',],data[target=='setosa',],'bo')
  107. plot(data[target=='versicolor',],data[target=='versicolor',],'r+')
  108. plot(data[target=='virginica',],data[target=='virginica',],'g*')
  109. show()
  110.  
  111. #注意:如果在Ubuntu的python交互式环境下运行,则figure会打断程序的RUN.
  112. #如果你用Anaconda的spyder(Python2.)则方便的多,生成的figure会自动输出到console
  113. #且不会打断程序运行!
  114.  
  115. #figure for all 4D(4个维度) data, 同色一类,圈是花萼,加号花瓣
  116. setosa_sepal_x=ssx=data[target=='setosa',]
  117. setosa_sepal_y=ssy=data[target=='setosa',]
  118. setosa_petal_x=spx=data[target=='setosa',]
  119. setosa_petal_y=spy=data[target=='setosa',]
  120.  
  121. versicolor_sepal_x=vsx=data[target=='versicolor',]
  122. versicolor_sepal_y=vsy=data[target=='versicolor',]
  123. versicolor_petal_x=vpx=data[target=='versicolor',]
  124. versicolor_petal_y=vpy=data[target=='versicolor',]
  125.  
  126. virginica_sepal_x=vgsx=data[target=='virginica',]
  127. virginica_sepal_y=vgsy=data[target=='virginica',]
  128. virginica_petal_x=vgpx=data[target=='virginica',]
  129. virginica_petal_y=vgpy=data[target=='virginica',]
  130.  
  131. plot(ssx,ssy,'bo',spx,spy,'b+')
  132. plot(vsx,vsy,'ro',vpx,vpy,'r+')
  133. plot(vgsx,vgsy,'go',vgpx,vgpy,'g+')
  134. show()
  135.  
  136. #figure for 1D(花萼的长度),三类长度及平均值的直方图
  137. #pylab详细用法参考如下
  138. #http://hyry.dip.jp/tech/book/page/scipy/matplotlib_fast_plot.html
  139. from pylab import figure, subplot, hist, xlim, show
  140. xmin = min(data[:,])
  141. xmax = max(data[:,])
  142. figure() #可省略,默认会生成一个figure
  143. subplot() # distribution of the setosa class (1st, on the top)
  144. hist(data[target=='setosa',],color='b',alpha=.)
  145. xlim(xmin,xmax)
  146. #subplot(行,列,plot号);(,,)合并为412,都小于10可合成
  147. subplot() # distribution of the versicolor class (2nd)
  148. hist(data[target=='versicolor',],color='r',alpha=.)
  149. xlim(xmin,xmax)
  150. subplot() # distribution of the virginica class (3rd)
  151. hist(data[target=='virginica',],color='g',alpha=.)
  152. xlim(xmin,xmax)
  153. subplot() # global histogram (4th, on the bottom)
  154. hist(data[:,],color='y',alpha=.)
  155. xlim(xmin,xmax)
  156. show()
  157.  
  158. ###########################
  159. #()样本分类
  160. # 朴素贝叶斯分类器是常用的一种,分为(高斯模型/非多项式模式/非伯努利模式)
  161. ###########################
  162.  
  163. #仿造target阵列(1维)弄出全0的t阵列
  164. t = zeros(len(target))
  165. #type(t) #show type of t (numpy.ndarray)
  166. #print t #show contains of t
  167. #将target阵列中特定元素的位置设置为1(真简洁)
  168. t[target == 'setosa'] =
  169. t[target == 'versicolor'] =
  170. t[target == 'virginica'] =
  171. #print t
  172.  
  173. #用全部data集来做训练
  174. from sklearn.naive_bayes import GaussianNB
  175. classifier = cf = GaussianNB()
  176. cf.fit(data,t) # training on the iris dataset
  177. print (cf.predict(data[])) #训练完分类1条数据
  178. #output:[ .]
  179. print (t[])
  180. #output:1.0
  181.  
  182. #从原始数据data中划分为训练集和验证集,t也做同样划分
  183. from sklearn import cross_validation
  184. train, test, t_train, t_test = cross_validation.train_test_split(data, t, \
  185. test_size=0.4, random_state=)
  186.  
  187. print (train.shape)
  188. #output:(, )
  189. print (test.shape)
  190. #output:(, )
  191. print (t_train.shape)
  192. #output:(,)
  193. print (t_test.shape)
  194. #output:(,)
  195.  
  196. #用60%数据训练后,再用40%数据验证,得到93.%
  197. cf.fit(train,t_train) # train
  198. print (cf.score(test,t_test)) # test
  199. #output:0.93333333333333335
  200. cf.score(train,t_train) #用训练集训练后同样用它测试居然不是100%分类!
  201. #output:0.97777777777777775
  202.  
  203. #用全部数据训练后,同样用它测试,结果低于刚才97%
  204. cf.fit(data,t)
  205. #output:GaussianNB()
  206. cf.score(data,t)
  207. #output:0.95999999999999996
  208.  
  209. #用100%数据训练后,再用40%数据验证,得到94.%
  210. cf.fit(data,t)
  211. #output:GaussianNB()
  212. cf.score(test,t_test)
  213. #output:0.94999999999999996
  214.  
  215. #############################################################
  216. #TODO:研究计划(笔者会另立博文研究此问题)
  217. #因为朴素贝叶斯分类法基于每个feature都是概率独立不相关。但其实相关,可尝试:
  218. #.显然花萼长宽,花瓣的长宽,是很强的相关性,形成2个新feature;为sepal-size,petal-size
  219. #.花萼与花瓣的长度合并,宽度合并,可能也有相关性,形成2个新feature!为whole-length,whole-wide
  220. #.原来花萼长与宽,花瓣长与宽,就是4个初始feature;
  221. #.以上初步判断的8个feature的组合关系?举例:一种花,就是花瓣很小,花萼较大呢?生物学有必然比例ratio吗?
  222. # 再比如,一种花整体都很修长?或矮短?
  223. # 我们也怀疑sepal-size和petal-size有一定的概率联系(正相关或负相关或某种关系)
  224. # 即使分类器做到了100%,对未来样本的分类也不一定100%正确,因为样本的收集也存在标定误差(人为录入误差)
  225. #TRY:尝试变更模型,数据转换后,再次做分类测试,交叉验证,期望提升准确率!
  226. #############################################################
  227.  
  228. #用混淆矩阵估计分类器表现
  229. from sklearn.metrics import confusion_matrix
  230. print (confusion_matrix(cf.predict(test),t_test))
  231. #output:[[ ]
  232. #output: [ ]
  233. #output: [ ]]
  234.  
  235. #混淆矩阵简单说明
  236. # 预测情况
  237. # -----------
  238. # 类1 类2 类3
  239. #实 |类1
  240. #际 |类2
  241. #情 |类3
  242. #况 |
  243. #
  244. #说明:正确的猜测都在表格的对角线
  245. #解读:实际情况是3个类每个都50个样本;
  246. # 类3有1个错误的猜测为类2;
  247. # 类2有2个错误的猜测为类1,3个错误的识别为类3
  248. # 类1有5个错误的猜测为类2,2个错误的识别为类3
  249.  
  250. #分类器性能的完整报告
  251. #Precision:正确预测的比例
  252. #Recall(或者叫真阳性率):正确识别的比例
  253. #F1-Score:precision和recall的调和平均数
  254.  
  255. from sklearn.metrics import classification_report
  256. print (classification_report(classifier.predict(test), t_test, target_names=['setosa', 'versicolor', 'virginica']))
  257. #output: precision recall f1-score support
  258. #output: setosa 1.00 1.00 1.00
  259. #output:versicolor 1.00 0.85 0.92
  260. #output: virginica 0.81 1.00 0.89
  261. #output:avg / total 0.95 0.93 0.93
  262.  
  263. ##############################################################
  264. #补充调和平均数知识点
  265. #调和平均数:Hn=n/(/a1+/a2+...+/an)
  266. #几何平均数:Gn=(a1a2...an)^(/n)
  267. #算术平均数:An=(a1+a2+...+an)/n
  268. #平方平均数:Qn=√ [(a1^+a2^+...+an^)/n]
  269. #这四种平均数满足 Hn ≤ Gn ≤ An ≤ Qn
  270. #
  271. #调和平均数典型举例:
  272. #问:有4名学生分别在一个小时内解题3、、、8道,求平均解题速度多少(1小时能解几道)?
  273. #答:就是求调和平均数,即1/[(/+/+/+/)/]=/(/+/+/+/)=4.57
  274. ###########################################################
  275.  
  276. #以上仅仅只是给出用于支撑测试分类的数据量。
  277. #分割数据、减少用于训练的样本数以及评估结果等操作
  278. #都依赖于配对的训练集和测试集的随机选择
  279.  
  280. #如果要切实评估一个分类器并与其它的分类器作比较的话,
  281. #我们需要使用一个更加精确的评估模型,例如Cross Validation。
  282. #该模型背后的思想很简单:多次将数据分为不同的训练集和测试集,
  283. #最终分类器评估选取多次预测的平均值。
  284. #sklearn为我们提供了运行模型的方法:
  285.  
  286. from sklearn.cross_validation import cross_val_score
  287. # cross validation with iterations
  288. scores = cross_val_score(classifier, data, t, cv=)
  289. print (scores)
  290. #output:[ 0.92592593 . 0.91666667 0.91666667 0.95833333 . ]
  291. #并非迭代越多次越好。当前CV=,迭代6次
  292.  
  293. #输出是每次模型迭代产生的精确度的数组。我们可以很容易计算出平均精确度:
  294. from numpy import mean
  295. print (mean(scores))
  296. #output:0.96
  297.  
  298. #循环不断增加迭代cv次数,并输出mean值
  299. #迭代CV必须>=,否则报错'ValueError: k-fold cross validation requires at least one train / test split by setting n_folds=2 or more, got n_folds=1.'
  300. #迭代CV必须小于最小的一个样本数目(对t=;t_train=;t_test=),详见后面ndarray归类打印!
  301. #.穷举data的所有迭代cv可能的交叉验证平均值并打印
  302. for i in range(, ):
  303. scores = cross_val_score(classifier, data, t, cv=i)
  304. print (mean(scores)) #每句for语句在交互式界面必须跟一行空行(没任何字符包括空格)才能表示输入结束!
  305.  
  306. #.穷举test的所有迭代cv可能的交叉验证平均值并打印
  307. for i in range(, ): print (mean(cross_val_score(classifier, test, t_test, cv=i)))
  308.  
  309. #.穷举train的所有迭代cv可能的交叉验证平均值并打印
  310. for i in range(, ): print (mean(cross_val_score(classifier, train, t_train, cv=i)))
  311.  
  312. #
  313. #
  314. #对一维numpy.ndarray数字值归类并打印
  315. ndarray={}
  316. for item in t: ndarray[item] = ndarray.get(item, ) +
  317. #下面必须有一行空行(没任何空格!),让交互式python确认for语句完成输入
  318.  
  319. print(ndarray)
  320. #output:{1.0: , 2.0: , 3.0: }
  321.  
  322. #对一维numpy.ndarray数字值归类并打印
  323. ndarray={}
  324. for item in t_train: ndarray[item] = ndarray.get(item, ) +
  325. #下面必须有一行空行,让交互式python确认for语句完成输入
  326.  
  327. print(ndarray)
  328. #output:{1.0: , 2.0: , 3.0: }
  329.  
  330. #对一维numpy.ndarray数字值归类并打印
  331. ndarray={}
  332. for item in t_test: ndarray[item] = ndarray.get(item, ) +
  333. #下面必须有一行空行,让交互式python确认for语句完成输入
  334.  
  335. print(ndarray)
  336. #output:{1.0: , 2.0: , 3.0: }
  337.  
  338. #
  339. #
  340. #***********************************
  341. #附加内容:写一个循环,从1和n-1到n-1和1来划分训练集和验证集;
  342. #TODO: 并对每种划分应用model(此处是朴素贝叶斯分类器-高斯模型)训练后交叉验证;
  343. # 交叉验证时也穷举所有可能的cv迭代次数;
  344. # 收集数据并显示,看此model对已知数据集合的分类最优点在哪里?
  345. # figure的X是train/data(训练集合占比%)(,);Y轴交叉验证mean值的迭代穷举后均值!(,)
  346. # 因为训练集和验证集划分每次是随机的,每RUN一次会有一张不同的二维图
  347. #TODO: 进一步扩展,对一个矩阵样本,能否自动的按照一定规律,穷举各种算法模型的结果?
  348. # 并能设定阈值报警。这样我们就有个一个遍历所有算法的基础toolbox,对原始矩阵样式的样本
  349. # 做自动auto的扫描,提供基本的信息和情况,然后再人为去研究。
  350. #***********************************
  351.  
  352. ###########################
  353. #()聚类
  354. ###########################
  355. #k-means算法简介:算法接受输入量k ,并将n个数据对象分为k个聚类;获得的聚类满足:同一聚类中的对象相似度较高;不同聚类中对象相似度低;
  356. # 聚类相似度是利用各聚类中对象的均值所获得一个“中心对象”(引力中心)来进行计算。
  357. #k-means 算法基本步骤:
  358. #() 从 n个数据对象任意选择k个对象作为初始聚类中心(最终期望聚为k类);
  359. #() 根据每个聚类对象的均值(中心对象),计算每个对象与这些中心对象的距离;按最小距离重新对相应对象进行划分;
  360. #() 重新计算每个(有变化)聚类的均值(中心对象);
  361. #() 计算标准测度函数,当满足一定条件,如函数收敛时,则算法终止;如果条件不满足则回到步骤()。
  362. ############################
  363.  
  364. from sklearn.cluster import KMeans
  365. kms = KMeans(n_clusters=) # initialization 先验知道3种植物,所以设定引力中心为聚合成3类。
  366. #kmeans = KMeans(k=, init='random') # both parameters are wrong
  367. kms.fit(data) # actual execution
  368. c = kms.predict(data)
  369.  
  370. from sklearn.metrics import completeness_score, homogeneity_score
  371. print (completeness_score(t,c))
  372. #output:0.764986151449
  373. print (homogeneity_score(t,c))
  374. #output:0.751485402199
  375.  
  376. #特别注意!t中只要是3类值就行,不一定非要1,,
  377. #当大部分数据点属于一个给定的类并且属于同一个群集,那么完整性得分就趋向于1。
  378. #当所有群集都几乎只包含某个单一类的数据点时同质性得分就趋向于1.
  379. figure()
  380. subplot() # top figure with the real classes
  381. plot(data[t==,],data[t==,],'bo')
  382. plot(data[t==,],data[t==,],'ro')
  383. plot(data[t==,],data[t==,],'go')
  384. subplot() # bottom figure with classes assigned automatically
  385. plot(data[c==,],data[c==,],'bo',alpha=.)
  386. plot(data[c==,],data[c==,],'go',alpha=.)
  387. plot(data[c==,],data[c==,],'mo',alpha=.)
  388. show()
  389.  
  390. #观察此图我们可以看到,底部左侧的群集可以被k-means完全识别,
  391. #然而顶部的两个群集有部分识别错误。按照kmean的中心对象是引力中心的聚类方法
  392. #出现识别错误是必然的;样本的偶然性可能导致识别错误
  393.  
  394. #如下是将4个feature维度组合为2个点放入一个平面,也可以看到聚类为3种后,
  395. #边界变得清晰了。
  396. import matplotlib.pyplot as plt
  397. plt.figure()
  398. plt.subplot() # top figure with the real classes
  399. plt.plot(data[t==,],data[t==,],'bo',data[t==,],data[t==,],'b+')
  400. plt.plot(data[t==,],data[t==,],'ro',data[t==,],data[t==,],'r+')
  401. plt.plot(data[t==,],data[t==,],'go',data[t==,],data[t==,],'g+')
  402. plt.subplot() # bottom figure with classes assigned automatically
  403. plt.plot(data[c==,],data[c==,],'bo',data[c==,],data[c==,],'b+',alpha=.)
  404. plt.plot(data[c==,],data[c==,],'ro',data[c==,],data[c==,],'r+',alpha=.)
  405. plt.plot(data[c==,],data[c==,],'go',data[c==,],data[c==,],'g+',alpha=.)
  406. p=plt
  407. fig=plt.gcf()
  408. fig.show() # p.show()也可,但二者只能执行一次。
  409.  
  410. ###########################
  411. #()回归
  412. ###########################
  413.  
  414. #回归是一个用于预测变量之间函数关系调查的方法。
  415. #假设有两个变量:一个被认为是因,一个被认为是果。
  416. #回归模型描述两者关系;从一个变量推断另一个变量;
  417. #当这种关系是一条线时,称为线性回归。
  418.  
  419. ##############
  420. #sklear.linear_model模块中的LinearRegression模型。
  421. #它通过计算每个数据点到拟合线的垂直差的平方和,
  422. #找到平方和最小的最佳拟合线。类似sklearn模型;
  423. #
  424. ##############
  425.  
  426. #下面举例随机产生了40个点样本,但大致函数趋势是
  427. #在第一象限线性增长,用线性回归来找出拟合线并评估
  428. #Step1-随机产生第一象限40个点
  429. from numpy.random import rand
  430. x = rand(,) # explanatory variable
  431. y = x*x*x+rand(,)/ # depentend variable
  432.  
  433. #Step2-线性回归
  434. from sklearn.linear_model import LinearRegression
  435. linreg = LinearRegression()
  436. linreg.fit(x,y)
  437.  
  438. #Step3-随机产生x变量,用线性回归模型推断y变量(推断出来是一条线)
  439. from numpy import linspace, matrix
  440. #产生0到1之间40个样本值
  441. randx = linspace(,,)
  442. #用随机产生的40个x轴样本,用线性回归预测其y轴样本,并输出比较
  443. #推断y时先将x当做矩阵转置为y再推断
  444. plot(x,y,'o',randx,linreg.predict(matrix(randx).T),'--r')
  445. show()
  446.  
  447. #Step4-通过测量MSE指标看拟合线与真实数据的距离平方。0最好
  448. from sklearn.metrics import mean_squared_error
  449. print (mean_squared_error(linreg.predict(x),y))
  450.  
  451. #########################
  452. #针对本例实际花萼的长宽数据做线性回归
  453. #########################
  454. #获取x和y(需要reshape来转换数组(,)到一维矩阵(,),才能做linreg.fit!
  455. ssx_blue=data[target=='setosa',].reshape((,)) #获取setosa的sepal花萼length
  456. ssy_blue=data[target=='setosa',].reshape((,)) #获取setosa的sepal花萼width
  457.  
  458. #用x和y获得线性回归模型
  459. linreg = LinearRegression()
  460. linreg.fit(ssx_blue,ssy_blue)
  461.  
  462. #随机产生x变量,用线性回归模型推断y变量(推断出来是一条线)
  463. #根据经验蓝色品种setosa的花萼sepal的长宽尺寸一般为X:[4.0-6.0]y:[2.5-4.5]
  464. randx = linspace(4.0,6.0,)
  465. plot(ssx_blue,ssy_blue,'o',randx,linreg.predict(matrix(randx).T),'--r')
  466. show()
  467.  
  468. #通过测量MSE指标看拟合线与真实数据的距离平方。0最好
  469. print (mean_squared_error(linreg.predict(ssx_blue),ssy_blue))
  470.  
  471. ###########################
  472. #()相关性分析
  473. ###########################
  474.  
  475. #通过研究feature之间的相关性来理解变量之间是否相关,相关强弱。
  476. #相关性分析帮助定位被依赖的重要变量。最好的相关方法可能是皮尔逊积矩相关系数。
  477. #它是由两个变量的协方差除以它们的标准差的乘积计算而来。
  478. #我们将鸢尾花数据集的4个变量两两组合计算出其相关性系数。
  479. #特别说明:feature是可以组合与变换的,所以不一定是未处理的初始feature两两做相关性判断,
  480. # 而可能是人为判断有相关性的,尝试组合或变换feature再不断测试相关性。
  481.  
  482. #当值一起增长时相关性为正。当一个值减少而另一个值增加时相关性为负。
  483. #1代表完美的正相关,0代表不相关,-1代表完美的负相关。
  484.  
  485. #本例红色被关联为最高的正相关,可以看出最强相关是:
  486. #“花瓣宽度”petal width和“花瓣长度”petal length这两个变量。
  487.  
  488. from numpy import corrcoef
  489. corr = corrcoef(data.T) # .T gives the transpose
  490. print (corr)
  491. #output:[[ . -0.10936925 0.87175416 0.81795363]
  492. #output: [-0.10936925 . -0.4205161 -0.35654409]
  493. #output: [ 0.87175416 -0.4205161 . 0.9627571 ]
  494. #output: [ 0.81795363 -0.35654409 0.9627571 . ]]
  495.  
  496. from pylab import pcolor, colorbar, xticks, yticks
  497. from numpy import arange
  498. pcolor(corr) #添加相关性矩阵,4个属性所以是4x4
  499. colorbar() #添加彩色注释条
  500. #添加X,Y轴注释,默认一个属性是1,坐标是1,,,,对应四个属性name如下。
  501. xticks(arange(,),['sepal length', 'sepal width', 'petal length', 'petal width'],rotation=-)
  502. yticks(arange(,),['sepal length', 'sepal width', 'petal length', 'petal width'],rotation=-)
  503. show()
  504.  
  505. ###########################
  506. #()成分分析(降维)
  507. # 涉及算法之一PCA
  508. ###########################
  509.  
  510. from sklearn.decomposition import PCA
  511. #降维到更少feature(主成分)不仅仅是为了可视化
  512. #虽然3D也可以看,但不直观,最直观的是2D平面图,而4D或更高维人眼无法观察
  513. #所以将data中原始4个feature降维到2维来观察。
  514. #特别注意:它等于自动的将feature做了算法组合,以期望分离不同种类。
  515. pca = PCA(n_components=)
  516.  
  517. pcad = pca.fit_transform(data)
  518.  
  519. plot(pcad[target=='setosa',],pcad[target=='setosa',],'bo')
  520. plot(pcad[target=='versicolor',],pcad[target=='versicolor',],'ro')
  521. plot(pcad[target=='virginica',],pcad[target=='virginica',],'go')
  522. show()
  523.  
  524. #查看主成分PC
  525. print (pca.explained_variance_ratio_)
  526. #output: [ 0.92461621 0.05301557]
  527. pc1, pc2 = pca.explained_variance_ratio_ #保存2个PC
  528.  
  529. print (-sum(pca.explained_variance_ratio_))
  530. #output:0.0223682249752
  531. print (1.0-pc1-pc2) #等价于上述输出
  532.  
  533. #逆变换还原数据
  534. data_inv = pca.inverse_transform(pcad)
  535. #比较还原后数据和原始数据的相似度
  536. print (abs(sum(sum(data - data_inv))))
  537. #output:6.66133814775e-15
  538.  
  539. #循环尝试:PC数量从1维到4维(原始数据也是4维)
  540. #看PCA覆盖信息量;4个肯定100%,3个也很高了;
  541. for i in range(,):
  542. pca = PCA(n_components=i)
  543. pca.fit(data)
  544. print (sum(pca.explained_variance_ratio_) * ,'%')
  545.  
  546. #output:92.4616207174 %
  547. #output:97.7631775025 %
  548. #output:99.481691455 %
  549. #output:100.0 %
  550.  
  551. print ("END")
  552. #END
  1.  

IRIS数据集的分析-数据挖掘和python入门-零门槛的更多相关文章

  1. 基于flask的可视化动漫分析网站【python入门必学】

    课程设计项目名称:基于flask的可视化动漫分析网站,如果你在学习Python的过程中,往往因为没有好的教程或者没人指导从而导致自己容易放弃,为此我建了个Python交流.裙 :一久武其而而流一思(数 ...

  2. 从Iris数据集开始---机器学习入门

    代码多来自<Introduction to Machine Learning with Python>. 该文集主要是自己的一个阅读笔记以及一些小思考,小总结. 前言 在开始进行模型训练之 ...

  3. 用Python实现支持向量机并处理Iris数据集

    SVM全称是Support Vector Machine,即支持向量机,是一种监督式学习算法.它主要应用于分类问题,通过改进代码也可以用作回归.所谓支持向量就是距离分隔面最近的向量.支持向量机就是要确 ...

  4. 机器学习笔记2 – sklearn之iris数据集

    前言 本篇我会使用scikit-learn这个开源机器学习库来对iris数据集进行分类练习. 我将分别使用两种不同的scikit-learn内置算法--Decision Tree(决策树)和kNN(邻 ...

  5. Iris数据集实战

    本次主要围绕Iris数据集进行一个简单的数据分析, 另外在数据的可视化部分进行了重点介绍. 环境 win8, python3.7, jupyter notebook 目录 1. 项目背景 2. 数据概 ...

  6. 6 小时 Python 入门

    6 小时 Python 入门 以下操作均在 Windows 环境下进行操作,先说明一下哈 一.安装 Python 1.官网下载 Python 进入官网(https://www.python.org), ...

  7. Python入门 - 面向对象

    python很好的支持面向对象编程,本节主讲类的定义,类的构造方法,类的继承与方法重写,类的多继承. 一.类的定义 class Myclass() : def prt(self, str) : pri ...

  8. [转][RabbitMQ+Python入门经典] 兔子和兔子窝

    [转][RabbitMQ+Python入门经典] 兔子和兔子窝 http://blog.csdn.net/linvo/article/details/5750987 RabbitMQ作为一个工业级的消 ...

  9. Python入门、练手、视频资源汇总,拿走别客气!

    摘要:为方便朋友,重新整理汇总,内容包括长期必备.入门教程.练手项目.学习视频. 一.长期必备. 1. StackOverflow,是疑难解答.bug排除必备网站,任何编程问题请第一时间到此网站查找. ...

随机推荐

  1. 【续集】塞翁失马,焉知非福:由 Styles.Render 所引发 runAllManagedModulesForAllRequests="true" 的思考

    在上一篇中,还有个遗留问题没有解决,就是 ASP.NET MVC MapRoute .htm 不起作用,如果不使用 runAllManagedModulesForAllRequests="t ...

  2. SFC的OAM管理框架

    1.简介SFC Service Function Chain(SFC):一系列服务功能的顺序组合,主要是针对网络中的数据包/帧分类处理,还包括能够动态排序部署的网络功能并且这些网络功能间拓扑结构独立, ...

  3. 【集合框架】Java集合框架综述

    一.前言 现笔者打算做关于Java集合框架的教程,具体是打算分析Java源码,因为平时在写程序的过程中用Java集合特别频繁,但是对于里面一些具体的原理还没有进行很好的梳理,所以拟从源码的角度去熟悉梳 ...

  4. Mybatis - 动态sql

    learn from:http://www.mybatis.org/mybatis-3/dynamic-sql.html mybatis支持动态拼接sql语句.主要有: if choose (when ...

  5. 从零开始,搭建博客系统MVC5+EF6搭建框架(3),添加Nlog日志、缓存机制(MemoryCache、RedisCache)、创建控制器父类BaseController

    一.回顾系统进度以及本章概要 目前博客系统已经数据库创建.以及依赖注入Autofac集成,接下来就是日志和缓存集成,这里日志用的是Nlog,其实还有其他的日志框架如log4,这些博客园都有很多介绍,这 ...

  6. asp.net MVC helper 和自定义函数@functions小结

    asp.net Razor 视图具有.cshtml后缀,可以轻松的实现c#代码和html标签的切换,大大提升了我们的开发效率.但是Razor语法还是有一些棉花糖值得我们了解一下,可以更加强劲的提升我们 ...

  7. .Net语言 APP开发平台——Smobiler学习日志:实现在手机上调用摄像头进行扫描

    最前面的话:Smobiler是一个在VS环境中使用.Net语言来开发APP的开发平台,也许比Xamarin更方便 样式一 一.目标样式 我们要实现上图中的效果,需要如下的操作: 1.从工具栏上的&qu ...

  8. .Net语言 APP开发平台——Smobiler学习日志:实现手机上常见的ListMenuView

    最前面的话:Smobiler是一个在VS环境中使用.Net语言来开发APP的开发平台,也许比Xamarin更方便 一.目标样式 我们要实现上图中的效果,需要如下的操作: 1.从工具栏上的"S ...

  9. 基于Quartz.NET构建自己的动态作业调度器

    在日常的开发中,运行定时任务基本上已经是很普遍的需求了,可以通过windows服务+timer组件来实现,也可以使用第三方框架来集成,Quartz.NET就是一款从JAVA的Quartz移植过来的一个 ...

  10. ios 学习笔记之控件属性

    1.文本框 设置密码属性:Secure Text Entry 勾选; 设置文本框带清除属性: Clear Button =Is always visible;  默认是不带清除属性:Never app ...