python中的argsort
❶ 用python 求一个数组中最大的三个元素及其所在位置
参考代码如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace FindMaxWithIndex
{
/// <summary>
/// 有一个数组,每个元素的值都是实数,请写出求最大元素的值及其位置的算法
/// </summary>
class Program
{
static void Main(string[] args)
{
double[] Num = new[] { -8, 4543.9, 4543.9, 3, 45, 654.7, 7, 66, 35, 45, 4, 6, 4543.9, 5, 46, 54, 6, 43, 5.980, 34, 4543.9 };
//double[] Num = new [] { 1.0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 };
int[] index = SearchMaxWithIndex(Num);
Console.WriteLine("The max number is: {0}", Num[index[0]]);
Console.Write("The index of max number is:");
for (int i = 0; i < index.Length; i++)
{
if (index[i] == -1) break;
Console.Write(" '{0}'", index[i]);
}
Console.ReadKey();
}
private static int[] SearchMaxWithIndex(double[] arr)
{
int[] pos = new int[arr.Length]; //记录最大值所在位置的数组
int position = 0; //初始设定数组的第1个元素为最大值
int j = 1;//j指示位置数组pos的下标
for (int i = 1; i < arr.Length; i++)
{
if (arr[i] > arr[position])
{
position = i; //记下新的最大值的位置
j = 1; //位置数组pos的下标恢复为1,下标为0的位置为position预留
}
else if (arr[i] == arr[position])
pos[j++] = i; //记下重复最大值的位置
}
pos[0] = position; //位置数组pos的下标为0的位置为position预留
if (j < arr.Length) pos[j] = -1; //-1为标识值,表示位置数组pos下标为0, 1, 2…(j-1)的位置存放的是最大值所在的位置
return pos;
}
}
}
❷ 怎么用python进行数据
pandas是本书后续内容的首选库。pandas可以满足以下需求:
具备按轴自动或显式数据对齐功能的数据结构。这可以防止许多由于数据未对齐以及来自不同数据源(索引方式不同)的数据而导致的常见错误。.
集成时间序列功能
既能处理时间序列数据也能处理非时间序列数据的数据结构
数学运算和简约(比如对某个轴求和)可以根据不同的元数据(轴编号)执行
灵活处理缺失数据
合并及其他出现在常见数据库(例如基于SQL的)中的关系型运算
- #-*- encoding:utf-8 -*-import numpy as npimport osimport pandas as pdfrom pandas import Series,DataFrameimport matplotlib.pyplot as pltimport time#下面看一下cummin函数#注意:这里的cummin函数是截止到目前为止的最小值,而不是加和以后的最小值frame = DataFrame([[1,2,3,4],[5,6,7,8],[-10,11,12,-13]],index = list('abc'),columns = ['one','two','three','four'])print frame.cummin()print frame
- >>>
- one two three four
- a 1 2 3 4
- b 1 2 3 4
- c -10 2 3 -13
- one two three four
- a 1 2 3 4
- b 5 6 7 8
- c -10 11 12 -13
1、pandas数据结构介绍
两个数据结构:Series和DataFrame。Series是一种类似于以为NumPy数组的对象,它由一组数据(各种NumPy数据类型)和与之相关的一组数据标签(即索引)组成的。可以用index和values分别规定索引和值。如果不规定索引,会自动创建 0 到 N-1 索引。
相关系数与协方差
有些汇总
❸ python pca怎么得到主成份
一般步骤来实现PCA算法
(1)零均值化
假如原始数据集为矩阵dataMat,dataMat中每一行代表一个样本,每一列代表同一个特征。零均值化就是求每一列的平均值,然后该列上的所有数都减去这个均值。也就是说,这里零均值化是对每一个特征而言的,零均值化都,每个特征的均值变成0。实现代码如下:
[python]view plain
defzeroMean(dataMat):
meanVal=np.mean(dataMat,axis=0)#按列求均值,即求各个特征的均值
newData=dataMat-meanVal
returnnewData,meanVal
newData,meanVal=zeroMean(dataMat)
covMat=np.cov(newData,rowvar=0)
eigVals,eigVects=np.linalg.eig(np.mat(covMat))
eigValIndice=np.argsort(eigVals)#对特征值从小到大排序
n_eigValIndice=eigValIndice[-1:-(n+1):-1]#最大的n个特征值的下标
n_eigVect=eigVects[:,n_eigValIndice]#最大的n个特征值对应的特征向量
lowDDataMat=newData*n_eigVect#低维特征空间的数据
reconMat=(lowDDataMat*n_eigVect.T)+meanVal#重构数据
returnlowDDataMat,reconMat
函数中用numpy中的mean方法来求均值,axis=0表示按列求均值。
该函数返回两个变量,newData是零均值化后的数据,meanVal是每个特征的均值,是给后面重构数据用的。
(2)求协方差矩阵
[python]view plain
numpy中的cov函数用于求协方差矩阵,参数rowvar很重要!若rowvar=0,说明传入的数据一行代表一个样本,若非0,说明传入的数据一列代表一个样本。因为newData每一行代表一个样本,所以将rowvar设置为0。
covMat即所求的协方差矩阵。
(3)求特征值、特征矩阵
调用numpy中的线性代数模块linalg中的eig函数,可以直接由covMat求得特征值和特征向量:
[python]view plain
eigVals存放特征值,行向量。
eigVects存放特征向量,每一列带别一个特征向量。
特征值和特征向量是一一对应的
(4)保留主要的成分[即保留值比较大的前n个特征]
第三步得到了特征值向量eigVals,假设里面有m个特征值,我们可以对其排序,排在前面的n个特征值所对应的特征向量就是我们要保留的,它们组成了新的特征空间的一组基n_eigVect。将零均值化后的数据乘以n_eigVect就可以得到降维后的数据。代码如下:
[python]view plain
代码中有几点要说明一下,首先argsort对特征值是从小到大排序的,那么最大的n个特征值就排在后面,所以eigValIndice[-1:-(n+1):-1]就取出这个n个特征值对应的下标。【python里面,list[a:b:c]代表从下标a开始到b,步长为c。】
❹ python 操作符**与*的用法
1、**两个乘号就是乘方,比如2**4,结果就是2的4次方,结果是16。
代码样例:
(4)python中的argsort扩展阅读
1、如果是函数定义中参数前的*表示的是将调用时的多个参数放入元组中,**则表示将调用函数时的关键字参数放入一个字典中。
1)如定义以下函数
def func(*args):print(args)
当用func(1,2,3)调用函数时,参数args就是元组(1,2,3)
2)如定义以下函数
def func(**args):print(args)
当用func(a=1,b=2)调用函数时,参数args将会是字典{'a':1,'b':2}
2、如果是在函数调用中,*args表示将可迭代对象扩展为函数的参数列表。
1)args=(1,2,3)
func=(*args)
等价于函数调用func(1,2,3)
函数调用的**表示将字典扩展为关键字参数
2)args={'a':1,'b':2}
func(**args)
等价于函数调用 func(a=1,b=2)
参考资料
网络-Python
❺ python sklearn里有kmeans算法吗
K-Means是常用的聚类算法,与其他聚类算法相比,其时间复杂度低,聚类的效果也还不错,这里简单介绍一下k-means算法,下图是一个手写体数据集聚类的结果。
基本思想
k-means算法需要事先指定簇的个数k,算法开始随机选择k个记录点作为中心点,然后遍历整个数据集的各条记录,将每条记录归到离它最近的中心点所在的簇中,之后以各个簇的记录的均值中心点取代之前的中心点,然后不断迭代,直到收敛,算法描述如下:
上面说的收敛,可以看出两方面,一是每条记录所归属的簇不再变化,二是优化目标变化不大。算法的时间复杂度是O(K*N*T),k是中心点个数,N数据集的大小,T是迭代次数。
优化目标
k-means的损失函数是平方误差:
RSSk=∑x∈ωk|x?u(ωk)|2
RSS=∑k=1KRSSk
其中$\omega _k$表示第k个簇,$u(\omega _k)$表示第k个簇的中心点,$RSS_k$是第k个簇的损失函数,$RSS$表示整体的损失函数。优化目标就是选择恰当的记录归属方案,使得整体的损失函数最小。
中心点的选择
k-meams算法的能够保证收敛,但不能保证收敛于全局最优点,当初始中心点选取不好时,只能达到局部最优点,整个聚类的效果也会比较差。可以采用以下方法:k-means中心点
1、选择彼此距离尽可能远的那些点作为中心点;
2、先采用层次进行初步聚类输出k个簇,以簇的中心点的作为k-means的中心点的输入。
3、多次随机选择中心点训练k-means,选择效果最好的聚类结果
k值的选取
k-means的误差函数有一个很大缺陷,就是随着簇的个数增加,误差函数趋近于0,最极端的情况是每个记录各为一个单独的簇,此时数据记录的误差为0,但是这样聚类结果并不是我们想要的,可以引入结构风险对模型的复杂度进行惩罚:
K=mink[RSSmin(k)+λk]
$\lambda$是平衡训练误差与簇的个数的参数,但是现在的问题又变成了如何选取$\lambda$了,有研究[参考文献1]指出,在数据集满足高斯分布时,$\lambda=2m$,其中m是向量的维度。
另一种方法是按递增的顺序尝试不同的k值,同时画出其对应的误差值,通过寻求拐点来找到一个较好的k值,详情见下面的文本聚类的例子。
k-means文本聚类
我爬取了36KR的部分文章,共1456篇,分词后使用sklearn进行k-means聚类。分词后数据记录如下:
使用TF-IDF进行特征词的选取,下图是中心点的个数从3到80对应的误差值的曲线:
从上图中在k=10处出现一个较明显的拐点,因此选择k=10作为中心点的个数,下面是10个簇的数据集的个数。
{0: 152, 1: 239, 2: 142, 3: 61, 4: 119, 5: 44, 6: 71, 7: 394, 8: 141, 9: 93}
簇标签生成
聚类完成后,我们需要一些标签来描述簇,聚类完后,相当于每个类都用一个类标,这时候可以用TFIDF、互信息、卡方等方法来选取特征词作为标签。关于卡方和互信息特征提取可以看我之前的文章文本特征选择,下面是10个类的tfidf标签结果。
Cluster 0: 商家 商品 物流 品牌 支付 导购 网站 购物 平台 订单
Cluster 1: 投资 融资 美元 公司 资本 市场 获得 国内 中国 去年
Cluster 2: 手机 智能 硬件 设备 电视 运动 数据 功能 健康 使用
Cluster 3: 数据 平台 市场 学生 app 移动 信息 公司 医生 教育
Cluster 4: 企业 招聘 人才 平台 公司 it 移动 网站 安全 信息
Cluster 5: 社交 好友 交友 宠物 功能 活动 朋友 基于 分享 游戏
Cluster 6: 记账 理财 贷款 银行 金融 p2p 投资 互联网 基金 公司
Cluster 7: 任务 协作 企业 销售 沟通 工作 项目 管理 工具 成员
Cluster 8: 旅行 旅游 酒店 预订 信息 城市 投资 开放 app 需求
Cluster 9: 视频 内容 游戏 音乐 图片 照片 广告 阅读 分享 功能
实现代码
#!--encoding=utf-8
from __future__ import print_function
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.feature_extraction.text import HashingVectorizer
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans, MiniBatchKMeans
def loadDataset():
'''导入文本数据集'''
f = open('36krout.txt','r')
dataset = []
lastPage = None
for line in f.readlines():
if '< title >' in line and '< / title >' in line:
if lastPage:
dataset.append(lastPage)
lastPage = line
else:
lastPage += line
if lastPage:
dataset.append(lastPage)
f.close()
return dataset
def transform(dataset,n_features=1000):
vectorizer = TfidfVectorizer(max_df=0.5, max_features=n_features, min_df=2,use_idf=True)
X = vectorizer.fit_transform(dataset)
return X,vectorizer
def train(X,vectorizer,true_k=10,minibatch = False,showLable = False):
#使用采样数据还是原始数据训练k-means,
if minibatch:
km = MiniBatchKMeans(n_clusters=true_k, init='k-means++', n_init=1,
init_size=1000, batch_size=1000, verbose=False)
else:
km = KMeans(n_clusters=true_k, init='k-means++', max_iter=300, n_init=1,
verbose=False)
km.fit(X)
if showLable:
print("Top terms per cluster:")
order_centroids = km.cluster_centers_.argsort()[:, ::-1]
terms = vectorizer.get_feature_names()
print (vectorizer.get_stop_words())
for i in range(true_k):
print("Cluster %d:" % i, end='')
for ind in order_centroids[i, :10]:
print(' %s' % terms[ind], end='')
print()
result = list(km.predict(X))
print ('Cluster distribution:')
print (dict([(i, result.count(i)) for i in result]))
return -km.score(X)
def test():
'''测试选择最优参数'''
dataset = loadDataset()
print("%d documents" % len(dataset))
X,vectorizer = transform(dataset,n_features=500)
true_ks = []
scores = []
for i in xrange(3,80,1):
score = train(X,vectorizer,true_k=i)/len(dataset)
print (i,score)
true_ks.append(i)
scores.append(score)
plt.figure(figsize=(8,4))
plt.plot(true_ks,scores,label="error",color="red",linewidth=1)
plt.xlabel("n_features")
plt.ylabel("error")
plt.legend()
plt.show()
def out():
'''在最优参数下输出聚类结果'''
dataset = loadDataset()
X,vectorizer = transform(dataset,n_features=500)
score = train(X,vectorizer,true_k=10,showLable=True)/len(dataset)
print (score)
#test()
out()